歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> linuxshell編程指南第十八章------控制流結構1

linuxshell編程指南第十八章------控制流結構1

日期:2017/3/1 13:51:18   编辑:SHELL編程

前面討論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 [email protected] Sat Oct 26 11:35 113/3545 "Logwat"
U 2 [email protected] Wed Dec 11 09:49 90/3152 "Logwat"
>N 3 [email protected] Wed Dec 11 16:09 15/646
& 3
Message 3:
From [email protected] Wed Dec 11 16:09:29 2013
Date: Wed, 11 Dec 2013 16:09:29 +0800
From: root <[email protected]>
To: [email protected]

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 .。

Copyright © Linux教程網 All Rights Reserved