<b>2.3 shell中的控制流結構</b>
shell中的控制流結構也比較清晰,如下所示:
if ...then...
else...fi語句
case語句
for循環
until循環
while循環
break控制
continue控制
工作中用得最多的就是if語句、for循環、while循環及case語句,大家可以以這幾個為重點對象來學習。
if語句文法如下:
if 條件1
then
指令1
else
指令2
fi
if語句的進階用法:
指令1
else if 條件2
then
指令2
指令3
舉例說明下if語句的用法,示例如下:
#!/bin/bash
if [
"10" -lt "12" ]
echo "10确實比12小"
echo
"10不小于12"
case語句文法如下:
case 值 in
模式1)
;;
模式2)
指令2
*)
esac
case取值後面必須為單詞in,每一模式必須以右括号結束。取值可以為變量或常數。比對發現取值符合某一模式後,其間所有的指令都開始執行直至“;;”。模式比對符“*”表示任意字元,“?”表示任意單字元,“[..]”表示類或範圍中任意字元。
case語句适合列印成績或用于/etc/init.d/服務類腳本。以下面的腳本為例來說明下。
#case select
echo -n
"enter a number from 1 to 3:"
read ans
case $ans in
1)
echo "you select 1"
;;
2)
echo "you select 2"
3)
echo "you select 3"
*)
echo "`basename $0`: this is not
between 1 and 3"
exit;
下面是稍為複雜的執行個體說明,/etc/init.d/syslog腳本的部分代碼如下,大家注意case語句的用法,可以以此為參考編寫自己的case腳本:
case
"$1" in
start)
start
exit 0
;;
stop)
stop
reload|restart|force-reload)
**)
echo "usage: $0
{start|stop|reload|restart|force-reload}"
exit 1
esac
for循環語句的文法如下:
for 變量名 in 清單
do
指令
done
若變量值在清單裡,則for循環執行一次所有指令,使用變量名通路清單并且取值。指令可為任何有效的shell指令和語句,變量名為任意單詞。in清單可以包含清單、字元串和檔案名,還可以是數值範圍,例如{100..200},舉例說明如下:
for n in
{100..200}
host=192.168.1.$n
ping -c2 $host &>/dev/null
if [ $? = 0 ]; then
echo "$host is
up"
else
down"
fi
while循環語句的文法如下:
while條件
在linux中有很多逐行讀取一個檔案的方法,其中最常用的就是下面腳本裡的方法(管道法),而且這也是效率最高、使用最多的方法,筆者最喜歡用的也是管道法。為了給大家一個直覺的感受,下面将通過生成一個大檔案的方式來檢驗各種方法的執行效率。
在腳本裡,line這個變量是預定義的,并不需要重新定義,$filename後面接系統中實際存在着的檔案名。
管道方法的指令語句如下:
cat $filename |
while read line
腳本舉例說明如下:
#!/bin/bash
cat test.txt |
echo $line
done
}