Linux shell程序設(shè)計(jì)(七).控制結(jié)構(gòu)-2
?
??? 繼續(xù)結(jié)構(gòu)控制部分,今天學(xué)習(xí)一下while、for循環(huán),和其他的一些操作。
?
?
四、while語(yǔ)句
?
??? shell中有三種循環(huán)語(yǔ)句,分別是while語(yǔ)句、for語(yǔ)句、until語(yǔ)句
?
1、
while語(yǔ)句的格式為:
?
??? while 測(cè)試條件
??? do
??? 命令表
??? done
?
??? 說明:先執(zhí)行測(cè)試條件,如果為真,則進(jìn)入循環(huán)體執(zhí)行其中的命令,然后再做條件測(cè)試,直到測(cè)試條件為假時(shí)終止循環(huán)。
?
2、舉例1:
?
??? while [ $1 ]
??? do
????? if [ -f $1 ]
????? then echo "display:$1"
?????????? cat $1
????? else echo "$1 is not a file name."
????? fi
????? shift
??? done
?
??? 說明:程序?qū)Ω鱾€(gè)給定的位置參數(shù),首先判斷是否為普通文件,是則先是內(nèi)容,不是則報(bào)錯(cuò)。每次循環(huán)一個(gè)位置,用shift移位,直至所有參數(shù)比較完成。
?
3、舉例2:
?
??? echo "Key in file name -> \c"
??? read filename
??? echo "Key in data:"
??? while
????? read x
??? do
????? echo $x >> $filename
??? done
??? cat $filename
?
??? 說明:用戶輸入一個(gè)數(shù)據(jù),就添加到指定的文件中,直到用戶按Enter鍵為止,最后顯示文件內(nèi)容。
?
?
五、until語(yǔ)句
?
1、until語(yǔ)句的格式:
?
??? until 測(cè)試條件
??? do
????? 命令表
??? done
?
??? 說明:當(dāng)測(cè)試條件為假時(shí),才進(jìn)入循環(huán)體,直至測(cè)試條件為真后終止循環(huán)。(跟while相反)
?
2、舉例:
?
??? until [ "$2" = "" ]
??? do
????? cp $1 $2
????? shift 2
??? done
??? if [ "$1" != "" ]
??? then echo "bad argument!"
??? fi
?
??? 說明:如果第二個(gè)位置參數(shù)不為空,則將文件1復(fù)制給文件2,然后位置參數(shù)左移兩位,直至沒有第二個(gè)參數(shù)為止。在推出循環(huán)后再判斷第一個(gè)參數(shù)是否為空,若為空則報(bào)錯(cuò)。
?
?
六、for語(yǔ)句
?
??? for語(yǔ)句是最常用的循環(huán)結(jié)構(gòu)語(yǔ)句,有兩種方式:值表方式和算數(shù)表達(dá)式方式。
?
1、值表方式
?
??? 格式為:
??? for 變量 [ in 值表 ]; do 命令表; done
?
??? 例如:
??? for i in "${person[*]}"; do echo $i; done
?
??? 或者寫為:
??? for 變量 [ in 值表 ]
??? do
????? 命令名
??? done
??? 注:值表也可以是正則表達(dá)式
?
??? 示例:
??? dir=$1 ; shift
??? if [ -d $dir ]
??? then
????? cd $dir
????? for name
????? do
??????? if [ -f $name ]
??????? then cat $name
????????? echo "End of ${dir}/$name"
??????? else echo "Invalid file name :${dir}/$name"
??????? fi
????? done
??? else echo "Bad directory name :$dir"
??? fi
?
??? 說明:如果第一個(gè)位置參數(shù)是合法的目錄,則把后面各個(gè)位置參數(shù)對(duì)應(yīng)的文件顯示出來,若文件名不正確則顯示錯(cuò)誤信息。不過第一個(gè)位置參數(shù)不是合法目錄,則先是目錄名不對(duì)。
?
2、算數(shù)表達(dá)式方式
?
??? 格式為:
??? for (( e1;e2;e3 )); do 命令表; done
?
??? 或者:
??? for (( e1;e2;e3 ))
??? do
????? 命令表
??? done
?
??? 舉例:
??? for (( i=1;i<=$1;i++ ))
??? do
????? for (( j=1;j<=i;j++ ))
????? do
??????? echo -n "*"
????? done
????? echo ""
??? done
??? echo "end!"
?
?
七、其他命令
?
1、break命令
?
??? break命令可以使我們手動(dòng)控制跳出循環(huán)。
?
??? 其語(yǔ)法是:
??? break [n]
??? 其中n代表要跳出的循環(huán)層數(shù),默認(rèn)是1。若大于1,則從包含break語(yǔ)句的循環(huán)開始往外跳。
?
??? 舉例:
??? count=$#
??? cmd=echo
??? do
????? cmd="$cmd \$$count"
????? count=`expr $count -1`
????? if [ $count -eq 0 ]
????? then break
????? fi
??? done
??? eval $cmd
??? 說明:該循環(huán)總是為真,唯一的出口是執(zhí)行break語(yǔ)句。
?
2、continue語(yǔ)句
?
??? continue語(yǔ)句可以跳過循環(huán)體中后面的語(yǔ)句,直接回到本層循環(huán)的開頭,進(jìn)行下一次循環(huán)。
?
??? 其語(yǔ)法是:
??? continue [n]
??? 其中n表示從包含continue語(yǔ)句的最內(nèi)層循環(huán)開始向外跳的層數(shù)。默認(rèn)值為1。
?
??? 舉例:
??? for i in 1 2 3 4 5
??? do
????? if [ "$i" -eq 3 ]
????? then continue
????? else echo "$i"
????? fi
??? done
??? 說明:不打印3。
?
3、exit語(yǔ)句
?
??? exit語(yǔ)句用于立即退出正在執(zhí)行的shell腳本。
?
??? 其語(yǔ)法為:
??? exit [n]
??? 其中n是設(shè)定的退出值。默認(rèn)為最后一個(gè)命令的執(zhí)行狀態(tài)。
?
4、select語(yǔ)句
?
??? select語(yǔ)句一般用于菜單的設(shè)計(jì),它自動(dòng)完成接受用戶輸入的整個(gè)過程,顯示一組菜單項(xiàng)及用戶的選擇。
?
??? 其語(yǔ)法為:
??? select identifier[in word...]
??? do
????? 命令表
??? done
?
??? 舉例:
??? PS3="Choice?"
??? select choice in query add delete update list exit
??? do
????? case "$choice" in
????? query) echo "Call query routine"
???????????? break;;
????? add) echo "Call add routine"
?????????? break;;
????? delete) echo "Call delete routine"???
????????????? break;;
????? update) echo "Call update routine"
????????????? break;;
????? list) echo "Call list routine"
??????????? break;;
????? exit) echo "Call exit routine"
??????????? break;;
????? esac
??? done
??? echo "Your choice is:$choice"
?
??? 其運(yùn)行結(jié)果為:
??? 1)query
??? 2)add
??? 3)delete
??? 4)update
??? 5)list
??? 6)exit
??? Choice? 2(用戶輸入)
??? Call add routine
??? Your choice is: add
?
??? 說明:列出1-6個(gè)選項(xiàng)菜單,給出提示接受用戶選擇。若in word省略,則默認(rèn)按位置參數(shù)給定值。
?
?