shell的流程控制介紹
Lnux shell和Java、PHP等語言不一樣,它有一套自己的流程控制語句,其中包括條件語句(if,case),循環語句(for,while,until),循環控制語句(continue,break,shift)。下面我會通過一些簡單明了的例子來介紹下各個語句的使用方法。
一、條件語句
1、if語句
(1)單分支結構
if 判斷條件; then
條件為真的分支代碼
fi
示例:testif1.sh
#!/bin/bash a=5 if [[ a -gt 4 ]] ;then echo ‘ok‘ fi
(
if 判斷條件; then
條件為真的分支代碼
else
條件為假的分支代碼
fi
示例:testif2.sh
#!/bin/bash scores=40 if [[ $scores -gt 60 ]];then echo "pass" else echo "no pass" fi
這裏有個要特別註意的一點,就是結尾的fi是if倒過來拼寫,和接下來要介紹的case同樣的用法,case的結尾esac也是case倒過來的拼寫,千萬不要寫錯了,小編在第一次寫腳本的時候就沒註意到這一點,就總是出錯,仔細一檢查腳本原來是結尾符號寫反了,真的很尷尬呀!然後我就發現了一個減少錯誤的方法:就是在寫條件語句或是循環語句時,首先把語句的格式給寫完,然後再向裏邊添加要實現的語句,這樣就不會忘了寫結尾或是寫反了。其實這也只是我個人的習慣。
(3)多分支結構
if 判斷條件1; then
條件為真的分支代碼
elif 判斷條件2; then
條件為真的分支代碼
elif 判斷條件3; then
條件為真的分支代碼
else
以上條件都為假的分支代碼
fi
示例:testif3.sh
#!/bin/bash scores=40 if [[ $scores -gt 90 ]];then echo "very good!" elif [[ $scores -gt 80 ]]; then echo "good!" elif [[ $scores -gt 60 ]]; then echo "pass!" else echo "no pass!" fi
2、case語句
case 變量引用 in
PAT1)
分支1;;
PAT2)
分支2;;
......
*)
默認分支;;
esac
case支持glob風格的通配符:
*: 任意長度任意字符
?: 任意單個字符
[]:指定範圍內的任意單個字符
a|b: a或b
示例:testcase.sh
#/bin/bash echo " 本店菜品: 1.羊肉湯 2.辣子雞丁米飯 3.胡辣湯 4.餃子 5.拉面 6.燴面 read -p "請輸入序號查看價格: " num case $num in 1|4) echo "20¥" ;; 3|6) echo "10¥" ;; 2|5) echo "12¥" ;; *) echo "輸入錯誤" ;; esac unset num
二、循環語句
1、for循環
for 變量名 in 列表;do
循環體
done
或
for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式));do
循環體
done
註意:列表的方式可為:{1..n}、`seq 1 $n` 、/root/bin/*.sh
for循環的執行機制:
依次將列表中的元素賦值給“變量名”; 每次賦值後即執行一次循環體; 直到列表中的元素耗盡,循環結束。
示例:testfor1.sh
#!/bin/bash for i in $(seq 10); do #或 for i in `seq 1 10`; do echo $i done
說明:seq字符串只要用空格字符分割,每次for…in 讀取時候,就會按順序將讀到值,給前面的變量。
示例:testfor2.sh,這種格式類似於c語言格式,學過編程的應該都能看懂的。
#!/bin/bash for((i=1;i<=10;i++));do echo $i done
2、while循環
while循環用於不斷執行一系列命令,也用於從輸入文件中讀取數據;命令通常為測試條件。其格式為:
while CONDITION; do
循環體
done
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環。因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正。
進入條件:CONDITION為true
退出條件:CONDITION為false
示例:testwhile1.sh
#!/bin/bash i=10; while [[ $i -gt 5 ]];do echo $i let i-- done
運行結果:==============================
testwhile1.sh
10
9
8
7
6
這裏使用了 Bash let 命令,它用於執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量,具體可查閱:Bash let 命令
示例:testwhile2.sh(循環讀取文件中的內容)
#!/bin/bash while read line;do echo $line done < /etc/passwd
while循環還可用於讀取鍵盤信息。下面的例子中,輸入信息被設置為變量FILM,按<Ctrl-D>結束循環。
示例:testwhile3.sh
#!/bin/bash echo ‘按下 <CTRL-D> 退出‘ echo -n ‘輸入你最喜歡的網站名: ‘ while read FILM do echo "是的!$FILM 是一個好網站" done
運行結果:==============================
[[email protected] shell]#bash whileread1.sh
按下 <CTRL-D> 退出
輸入你最喜歡的網站名: 菜鳥教程
是的!菜鳥教程 是一個好網站
while無限循環:
while true(:); do 循環體 done
3、until循環
until CONDITION; do
循環體
done
意思是:直到滿足條件,就退出。否則執行循環體的內容。
進入條件:CONDITION為false
退出條件:CONDITION為true
until語句的執行正好和while相反,其實在平常寫腳本時,小編還是比較喜歡用while,感覺用著特別順手。
示例:testuntil.sh
#!/bin/bash a=10 until [[ $a -lt 0 ]];do echo $a let a-- done
until無限循環:
until false; do 循環體 done
三、循環控制語句
在循環過程中,有時候需要在未達到循環結束條件時強制跳出循環,Shell使用兩個命令來實現該功能:continue和break。
1、continue,主要用於循環體中
continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層。
continue 不會跳出所有循環,僅僅跳出當前循環。
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
示例:testcontinue.sh
#!/bin/bash while true ;do read -p "輸入 1 到 5 之間的數字: " aNum case $aNum in 1|2|3|4|5) echo "你輸入的數字為 $aNum!" ;; *) echo "你輸入的數字不是 1 到 5 之間的!" continue echo "遊戲結束" ;; esac done
運行結果:===================================
[[email protected] bin]#testcontinue.sh
輸入 1 到 5 之間的數字: 2
你輸入的數字為 2!
輸入 1 到 5 之間的數字: 7
你輸入的數字不是 1 到 5 之間的!
輸入 1 到 5 之間的數字: 3
你輸入的數字為 3!
2、break
break [N]:提前結束第N層循環,最內層為第1層。
break命令允許跳出所有循環,下面的例子中,腳本進入死循環直至用戶輸入數字大於5。要跳出這個循環,返回到shell提示符下,需要使用break命令。
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
示例:testbreak.sh
#!/bin/bash while true;do read -p "輸入 1 到 5 之間的數字:" aNum case $aNum in 1|2|3|4|5) echo "你輸入的數字為 $aNum!" ;; *) echo "你輸入的數字不是 1 到 5 之間的! 遊戲結束" break ;; esac done
運行結果:====================================
[[email protected] bin]#testbreak.sh
輸入 1 到 5 之間的數字:2
你輸入的數字為 2!
輸入 1 到 5 之間的數字:7
你輸入的數字不是 1 到 5 之間的! 遊戲結束
結合上邊兩個例子,我們可以看出:在continue循環中,如果輸入的不是1~5之間的數字,就會繼續運行腳本重新輸入,而不是退出腳本,相當於進入了死循環,因此,echo "遊戲結束"這行代碼永遠就不會被執行;而在break循環中,如果輸入的不是1~5之間的數字,就會跳出循環,退出腳本。
3、shift
用於將參量列表list 左移指定次數,缺省為左移一次。v
參量列表list 一旦被移動,最左端的那個參數就從列表中刪除。while 循環遍歷位置參量列表時,常用到shift。
示例:./doit.sh a b c d e f g h
#!/bin/bash while [ $# -gt 0 ] # or (( $# > 0 ));do echo $* shift done
./shfit.sh a b c d e f g h
#!/bin/bash until [ -z "$1" ] ;do echo "$1" shift done echo
最後還有一個不太常用的工具:select。
select 循環主要用於創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,並顯示PS3 提示符,等待用戶輸入。用戶輸入被保存在內置變量 REPLY 中。
select 是個無限循環,因此要記住用break 命令退出循環,或用exit 命令終止腳本。也可以按ctrl+c 退出循環。格式如下:
select variable in list
do
循環體命令
done
示例:testselect.sh
#/bin/bash PS3="請選擇菜單:" select menu in 羊肉湯 辣子雞丁 米飯 胡辣湯 餃子 拉面 燴面;do case $REPLY in 1|4) echo "20¥" ;; 3|6) echo "10¥" ;; 2|5) echo "12¥" ;; 7) break ;; *) echo "輸入錯誤" ;; esac
shell的流程控制介紹