本節索引:
一、if、case條件判斷
二、for、while及until循環
三、循環控制語句continue、break、shift及select菜單
四、信號捕捉trap
在前面的基礎編程內容中,我們已經學習了shell腳本的順序執行及選擇執行,通過這兩種方式,可
以幫我們解決一些簡單需求,但要想在更復雜的場景中使用的話,就需要掌握循環執行的方式了。
一、if、case條件判斷
條件判斷if語句:
if語句是指編程語言中用來判定所給定的條件是否滿足,根據判定的結果(真或假)決定執行
給出的兩種操作之一。
格式:
if?? 判斷條件1;then
條件1為真的分支代碼
elif 判斷條件2;then
條件2為真的分支代碼
elif 判斷條件3;then
條件3為真的分支代碼
else
以上條件都不滿足的分支代碼
fi
if語句會逐條件的進行判斷,當第一次遇到為“真”的條件時,就會執行其分支代碼,而后結束整個if語句。
條件判斷case語句:
case語句是實現選擇結構程序設計的一種語句,比較適合處理離散型變量。
格式:
case 變量引用 in
1|2|3)
cmd1
;;
4|5|6)
?? cmd2
;;
7|8|9)
cmd3
;;
*)
??? cmd4
esac
注意:case支持glob風格的通配符:
如:*????? 表示任意長度任意字符
???? 表示任意單個字符
[]????? 指定范圍內的任意單個字符
a|b??? a或者b
二、for、while及until循環
循環執行
將某代碼段重復運行多次
重復運行多少次
次數已知
次數未知
有進入條件和退出條件
循環主要語句有:for、whlie、until
for循環
for語句將循環一個列表中的每一個元素執行一次循環體代碼,直到列表中元素全部執行過一次。
一般用于次數預先知道的循環。
格式1:
for 變量名 in 列表;do
循環體
done
其中列表的生成方式有多種:
1.直接給出列表
2.整數列表:
(a){start..end[..step]}
(b)$(seq[start[step]end])
3.返回列表的命令:
$(COMMAND)
4.使用glob,如:*.sh
5.變量引用:
$@,$*等
執行機制:
依次將列表中的元素賦值給“變量名”,每次賦值后即執行一次循環體;直到列表中的
元素全部被執行,循環結束
格式2:C語言風格
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Arithmetic for loop.
Equivalent to
(( EXP1 ))
while (( EXP2 )); do
COMMANDS
(( EXP3 ))
done
例:利用for循環依次讀取列表{1..100}中的內容,并相加,得出1到100的數字之和
while循環
while結構循環為當型循環(when type loop),一般用于不知道循環次數的情況。維持循環的是一個條件表達式,條件成立執行循環體,條件不成立退出循環。
格式:
while 循環控制條件;do
???????? 循環體
done
循環控制條件:進入循環之前,先做一次判斷;每次循環之后會再次做判斷;當條件為True時,則繼續執行循環;直到條件測試狀態為false時終止循環。
例:利用while循環,定義變量i=0,當i小于100時,執行循環,并讓變量i每執行一次循環加1,直到i=100時停止循環,得出數字1到100之和
while循環的特殊用法(遍歷文件的每一行):
while read line; do
? 循環體
done < /PATH/FROM/SOMEFILE
依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line
for循環與while循環的區別:
for循環與while循環是可以相互替代的;比如:
for i in {1..10};do
echo “OK”
done
用while語句來寫的話:
i=1
while [ $i -le 10 ];do
echo “OK”
let i++
done
兩者意思都是打印10次“OK”,那什么時候用for循環,什么時候又用while循環呢?
for循環用于針對集合中的每個元素的一個代碼塊,而while循環不斷的運行,直到指定的條件不滿足為止。
一般來說:
for循環比較適合循環次數確定的情況
while循環適合循環次數不確定的情況
until循環
維持循環的也是一個條件表達式,但與while用法正好相反,條件不成立時執行循環體,條件成立時退出循環。
until 循環控制條件;do
???????? 循環體
done
until語句和while語句可相互轉化:
如:until [ test ];do? 等價于 while [ ! test ];do
三、循環控制語句continue、break、shift
continue語句
用于循環體中
continue[N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層
格式:
while 循環控制條件;do
???????? CMD1
???????? …
???????? if 判斷條件;then
????????????????? continue
???????? fi
???????? CMDn
???????? …
done
例:依次打印數字1至10,當continue出現在5循環中時,直接跳過,繼續執行6循環;
當continue出現在嵌套循環中時,continue 2,提前結束第二次本輪循環,并打印3次
break語句
用于循環體中
break[N]:提前結束第N層循環,最內層為第一層
while 循環控制條件;do
???????? CMD1
???????? …
???????? if 判斷條件;then
????????????????? break
???????? fi
???????? CMDn
???????? …
done
例:break語句將直接結束本輪循環
shift命令
shift[n]:將參量列表list左移指定次數,缺省為左移一次,適合用于處理位置參數
參量列表list一旦被移動,最左端的那個參數就從列表中刪除。while循環遍歷位置參量列表時,
常用到shift
例1:利用shifit,每次位置變量向左移動1位,并打印本次全部位置變量,直到位置變量為0個
例2:利用shifit,每次變量向左移動一位,并打印本次第一個位置變量,直到位置變量小于1時停止執行
避免出現無限循環:
while true;do
???????? 循環體
done
until false;do
???????? 循環體
done
每個程序員都會偶爾不小心而編寫出無限循環,在循環退出條件比較微妙時尤其如此,如果程序陷入無限循環,可按ctrl+c退出
要避免編寫無限循環,務必對每個while、until循環進行測試,確保它按預期那樣結束。
select循環與菜單
select 變量 in list;do
???????? 循環體命令
done
select循環主要用于創建菜單,常與case語句搭配使用,用戶輸入菜單列表中的某個數字,執行相應的命令
select是個無限循環,因此要記住用break命令退出循環,或用戶exit命令終止腳本??砂碿trl+c退出循環
與for循環類似,可以省略in list,此時使用位置變量。
相關變量:
$PS3 ?????? menu菜單提示符
$REPLY??? 保存用戶的輸入信息
四、信號捕捉trap
trap ‘觸發指令’信號
自定義進程收到系統發出的指定信號好,將執行觸發指令,而不會執行原操作
trap ” 信號
忽略信號的操作
trap ‘-‘ 信號
恢復原信號的操作
trap -p
列出自定義信號操作
例:打印數字1到10的過程中,trap -p顯示自定義信號操作,由于trap ”int捕獲了int信號,ctrl+c無法中斷顯示,且顯示自定義輸入:press ctrl+c;
打印數字11到20的過程中,由于trap ”int捕獲了int信號,ctrl+c無法中斷顯示
打印數字21到30的過程中,trap ‘-‘恢復了原信號操作,顧ctrl+c又可中斷顯示
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97879