知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

linuxshell编程指南第十八章------控制流结构1

发布时间:2014-09-05 13:34:55作者:知识屋

前面讨论e x p r时指出,循环时如果要加入计数,使用此命令。下面使用l s在f o r循环中列出
文件及其数目。

[root@localhost huangcd]# cat forcount

#!/bin/bash
counter=0
for files in *
do
counter=`expr $counter + 1`
done
echo "there are $counter files in `pwd` we need to process"
[root@localhost huangcd]# sh forcount
there are 76 files in /home/huangcd we need to process
[root@localhost huangcd]# ls|wc -l

嵌入循环可以将一个f o r循环嵌在另一个f o r循环内:
for 变量名1 in列表1
d o
for 变量名2 in 列表2
d o
命令1
. . .
d o n e
d o n e

下面脚本即为嵌入f o r循环,这里有两个列表A P P S和S C R I P T S。第一个包含服务器上应用
的路径,第二个为运行在每个应用上的管理脚本。对列表A P P S上的每一个应用,列表
S C R I P T S里的脚本将被运行,脚本实际上为后台运行。脚本使用t e e命令在登录文件上放一条
目,因此输出到屏幕的同时也输出到一个文件。查看输出结果就可以看出嵌入f o r循环怎样使
用列表S C R I P T S以执行列表A P P S上的处理。

[root@localhost huangcd]# cat audit_run
#!/bin/bash
APPS="/apps/accts /apps/claims /apps/stock /apps/serv"
SCRIPTS="audit.check report.run cleanup"
LOGFILE=audit.log
MY_DATE=`date +%H:%M" on "%d/%m%Y`


for loop in $APPS
do
for loop2 in $SCRIPTS
do
echo "system $loop now running $loop2 at $MY_DATE"|tee -a $LOGFILE $loop $loop2
done
done

u n t i l循环执行一系列命令直至条件为真时停止。u n t i l循环与w h i l e循环在处理方式上刚好
相反。一般w h i l e循环优于u n t i l循环,但在某些时候—也只是极少数情况下, u n t i l循环更加
有用。
u n t i l循环格式为:
until 条件
命令1
. . .
d o n e
条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。

这段脚本不断的搜寻w h o命令中用户r o o t,变量I S - R O O T保存g r e p命令结果。
如果找到了r o o t,循环结束,并向用户s i m o n发送邮件,通知他用户r o o t已经登录,注意
这里s l e e p命令用法,它经常用于u n t i l循环中,因为必须让循环体内命令睡眠几秒钟再执行,
否则会消耗大量系统资源。

[root@localhost huangcd]# cat until_who
#!/bin/bash
IS_ROOT=`who|grep root`
until [ "$IS_ROOT" ]
do
sleep 5
done
echo "watch it.roots in"|mail root
[root@localhost huangcd]# sh until_who
[root@localhost huangcd]# mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/root": 3 messages 1 new 3 unread
U 1 logwatch@localhost.l Sat Oct 26 11:35 113/3545 "Logwat"
U 2 logwatch@localhost.l Wed Dec 11 09:49 90/3152 "Logwat"
>N 3 root@localhost.local Wed Dec 11 16:09 15/646
& 3
Message 3:
From root@localhost.localdomain Wed Dec 11 16:09:29 2013
Date: Wed, 11 Dec 2013 16:09:29 +0800
From: root <root@localhost.localdomain>
To: root@localhost.localdomain

watch it.roots in

w h i l e循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量F I L M,按< C t r l -
D >结束循环。

[root@localhost huangcd]# cat whileread
#!/bin/bash
echo "type ctrl+d to terminate"
echo -n "enter your most like file:"
while read FILE
do
echo "yeah,great file the $FILE"
done
[root@localhost huangcd]# sh whileread
type ctrl+d to terminate
enter your most like file:ddfdfdf
yeah,great file the ddfdfdf
dfsf
yeah,great file the dfsf

w h i l e循环最常用于从一个文件中读取数据,因此编写脚本可以处理这样的信息。
假定要从下面包含雇员名字、从属部门及其I D号的一个文件中读取信息。

可以用一个变量保存每行数据,当不再有读取数据时条件为真。w h i l e循环使用输入重定
向以保证从文件中读取数据。注意整行数据被设置为单变量$ L I N E .。

(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜