免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: L_kernel
打印 上一主题 下一主题

shell基础第十八篇-控制流结构 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2010-11-20 22:23 |只看该作者
使用break和continue控制循环
有时需要基于某些准则退出循环或跳过循环步。s h e l l提供两个命令实现此功能。
• break。
• continue。


break
b r e a k命令允许跳出循环。b r e a k通常在进行一些处理后退出循环或c a s e语句。如果是在一
个嵌入循环里,可以指定跳出的循环个数。例如如果在两层循环内,用break 2刚好跳出整个
循环。

跳出case语句
下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到s h e l l
提示符下, b r e a k使用脚本如下:
  1. #!/bin/sh
  2. # breakout.sh
  3. # while : means loop forever
  4. while :
  5. do
  6.         echo -n "Enter any number [1..5] :"
  7.         read ANS
  8.         case $ANS in
  9.                 1|2|3|4|5) echo "great you entered a number 1 and 5"
  10.                 ;;
  11.                 *) echo "Wrong number ... bye"
  12.                 break
  13.                 ;;
  14.         esac   
  15. done
复制代码
continue
c o n t i n u e命令类似于b r e a k命令,只有一点重要差别,它不会跳出循环,只是跳过这个循
环步。

浏览文件行
下面是一个前面用过的人人文件列表,但是现在加入了一些头信息。
  1. [root@localhost ~]# cat name2.txt
  2. -------LISTING OF PERSONNEL FILE-------
  3. ---- TAKEN AS AT 06/1999 -----
  4. Louise Conrad:Accounts:ACC8987
  5. Peter James:Payroll:PR489
  6. Fred Terms:Customer:CUS012
  7. James Lenod:Accounts:ACC887
  8. Frank Pavely:Payroll:PR489
复制代码
假定现在需要处理此文件,看过文件之后知道头两行并不包含个人信息,因此需要跳过
这两行。
也不需要处理雇员Peter James,这个人已经离开公司,但没有从人员文件中删除。
对于头信息。只需简单计算所读行数,当行数大于2时开始处理,如果处理人员名字为
Peter James,也将跳过此记录。脚本如下:
  1. #!/bin/sh
  2. # whilecontinue.sh
  3. SAVEDIFS=$IFS
  4. IFS=:
  5. INPUT_FILE=name2.txt
  6. NAME_HOLD="Peter James"
  7. LINE_NO=0
  8. if [ -s $INPUT_FILE ]; then
  9.         while read NAME DEPT ID
  10.         do      
  11.                 LINE_NO=`expr $LINE_NO + 1`
  12.                 if [ "$LINE_NO" -le 2 ]; then
  13.                         # skip if the count is less than 2
  14.                         continue
  15.                 fi      
  16.                 if [ "$NAME" == "$NAME_HOLD" ]; then
  17.                         # skip if the name in NAME_HOLD is Peter James
  18.                         continue
  19.                 else   
  20.                         echo "Now processing ... $NAME $DEPT $ID"
  21.                         # all the processing goes here
  22.                 fi      
  23.         done < $INPUT_FILE
  24.         IFS=$SAVEDIFS
  25. else   
  26.         echo "`basename $0` : Sorry file not found or there is no data in the
  27.         file" >&2
  28.         exit 1
  29. fi      
复制代码
运行上面的脚本,输出如下的内容:
  1. Now processing ... Louise Conrad Accounts ACC8987
  2. Now processing ... Fred Terms Customer CUS012
  3. Now processing ... James Lenod Accounts ACC887
  4. Now processing ... Frank Pavely Payroll PR489
复制代码
菜单
创建菜单时,在w h i l e循环里n u l l空命令很合适。h i l e加空命令n u l l意即无限循环,这正是
一个菜单所具有的特性。当然除非用户选择退出或是一个有效选项。
创建菜单只需用w h i l e循环和c a s e语句捕获用户输入的所有模式。如果输入无效,则报警,
反馈错误信息,然后继续执行循环直到用户完成处理过程,选择退出选项。
菜单界面应是友好的,不应该让用户去猜做什么,主屏幕也应该带有主机名和日期,并
伴随有运行此菜单的用户名。由于测试原因,所有选项使用的是系统命令。
下面是即将显示的菜单。

首先,使用命令替换设置日期,主机名和用户。日期格式为/ D D / M M / Y Y Y Y,参数格式
为:
$ date +%d/%m/%y
3 2 / 0 5 / 1 9 9 9
对于主机名,使用h o s t n a m e - s选项只抽取主机名部分。主机名有时也包括了完全确认的域
名。当然如果要在屏幕上显示这些,那就更好了。
可以给变量一个更有意义的名字:
MYDATE=`date +%d/%m/%Y`
THIS_HOST=`hostname -s`
USER=`whoami`

对于w h i l e循环,只需将空命令直接放在w h i l e后,即为无限循环,格式为:
while :
d o
命令
d o n e
要注意实际屏幕显示,不要浪费时间使用大量的e c h o语句或不断地调整它们。这里使用
本地文档,在分界符后面接受输入,直至分界符被再次定位。格式为:
command << WORD
any input
WORD
此技术用于菜单屏幕,也将用于帮助屏幕。帮助屏幕不像这样复杂。
用c a s e语句控制用户选择。菜单选择有:
                        1 : List files in current directory
                        2 : Use the vi editor
                        3 : See who is on the system
                        H : Help screen
                        Q : Exit Menu


c a s e语句应控制所有这些模式,不要忘了将大写与小写模式并列在一起,因为有时用户会
关闭或打开CAPS LOCK键。因为菜单脚本不断循环,所以应该允许用户退出,如果用户选择
Q或q键,脚本应退出,此时脚本带有0值。
如果用户选择无效,应发出警报并带有警告信息。虽然本章开始说过从现在开始一直使
用L I N U X或BSD echo语句版本,这里必须使用系统V版本发出警报:
echo "\007 the bell ring"
用一个简单的e c h o和读语句锁屏直到用户点击回车键,这样任何信息或命令输出将可视。
也需要清屏,为此可使用t p u t命令(后面讨论t p u t),如果不这样做,使用c l e a r命令也可以。
到此所有功能已经具备了,脚本如下:
  1. #!/bin/sh
  2. # menu.sh
  3. # set the date, user and hostname up
  4. MYDATE=`date +%d/%m/%Y`
  5. THIS_HOST=`hostname -s`
  6. USER=`whoami`
  7. # loop forever !
  8. while:
  9. do
  10.         # clear the screen
  11.         tput clear
  12.         # here documents starts here
  13.         cat <<MAYDAY
  14.         _________________________________________________________
  15.         User: $USER         Host:$THIS_HOST     Date:$MYDATE
  16.         _________________________________________________________
  17.                         1 : List files in current directory
  18.                         2 : Use the vi editor
  19.                         3 : See who is on the system
  20.                         H : Help screen
  21.                         Q : Exit Menu
  22.         _________________________________________________________
  23.         MAYDAY
  24.         # here document finished
  25.         echo -e -n "\tYour Choice [1,2,3,H,Q] >"
  26.         read CHOICE
  27.         case $CHOICE in
  28.                 1) ls
  29.                 ;;
  30.                 2) vi
  31.                 ;;
  32.                 3) who
  33.                 ;;
  34.                 H|h)
  35.                 # use a here document for the help screen
  36.                 cat <<MAYDAY
  37.                 This is the help screen, nothing here yet to help you!
  38.                 MAYDAY
  39.                 ;;
  40.                 Q|q) exit 0
  41.                 ;;
  42.                 *) echo -e "\t\007unknown user response"
  43.                 ;;
  44.         esac
  45.         echo -e -n "\tHit the return key to continue"
  46.         read DUMMY
  47. done
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2010-11-20 22:24 |只看该作者
小结
在任何合理脚本的核心部分都有某种流控制,如果要求脚本具有智能性,必须能够进行
判断和选择。
本章讲述了怎样使用控制流写一段优美的脚本,而不只是完成基本功能。这里也学到了
怎样处理列表和循环直至条件为真或为假。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2010-11-20 22:25 |只看该作者
END
shell基础第十八篇-控制流结构
介绍完毕~~

论坛徽章:
0
14 [报告]
发表于 2010-11-21 10:02 |只看该作者
学习了

论坛徽章:
0
15 [报告]
发表于 2010-11-22 19:43 |只看该作者
这个要顶的。

论坛徽章:
0
16 [报告]
发表于 2011-02-17 16:06 |只看该作者
非常好的文章,拜读了

论坛徽章:
0
17 [报告]
发表于 2011-07-03 14:11 |只看该作者
辛苦了,写的很到位,很详细

论坛徽章:
0
18 [报告]
发表于 2012-01-31 17:36 |只看该作者
lz辛苦;很全面拜读了

论坛徽章:
0
19 [报告]
发表于 2013-08-14 10:24 |只看该作者
表示很有帮助

论坛徽章:
2
水瓶座
日期:2014-02-28 14:20:09辰龙
日期:2014-06-16 13:18:51
20 [报告]
发表于 2014-02-21 16:42 |只看该作者
阅读完毕,雁过留痕
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP