shell腳本之流程控制
條件語句
選擇執行:
注意:if語句可嵌套
單分支
if 判斷條件;then 條件爲真的分支代碼 fi
雙分支
if 判斷條件; then 條件爲真的分支代碼 else 條件爲假的分支代碼 fi
多分支
if 判斷條件1; then 條件爲真的分支代碼 elif 判斷條件2; then 條件爲真的分支代碼 elif 判斷條件3; then 條件爲真的分支代碼 else 以上條件都爲假的分支代碼 fi
逐條件進行判斷,第一次遇爲“真”條件時,執行其分支,而後結束整個if語句
示例:
if ping -c 1 -W 2 station1 &>/dev/null;then echo'Station1isUP' elif grep"station1"~/maintenance.txt&>/dev/null ;then echo'Station1isundergoingmaintenance‘ else echo'Station1isunexpectedlyDOWN!' exit1 fi
條件判斷
case 變量引用in PAT1) 分支1 ;; PAT2) 分支2 ;; ... *) 默認分支 ;; esac
case支持glob風格的通配符:
*:任意長度任意字符
?:任意單個字符
[]:指定範圍內的任意單個字符
a|b: a或b
循環語句for,while,until
for循環
for 變量名in 列表;do 循環體 done
執行機制:
依次將列表中的元素賦值給“變量名”; 每次賦值後即執行一次循環體; 直到列表中的元素耗盡,循環結束 列表生成方式
:
- (1) 直接給出列表
- (2) 整數列表:
- (a) {start..end}
- (b) $(seq[start [step]] end)
- (3) 返回列表的命令 $(COMMAND)
- (4) 使用glob,如:*.sh
- (5) 變量引用;$@, $*
while循環
while CONDITION; do 循環體 done
`CONDITION
:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件爲“true”,則執行一次循環;直到條件測試狀態爲“false”終止循環
因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
進入條件
:CONDITION爲true 退出條件
:CONDITION爲false
until循環
until CONDITION; do 循環體 done
CONDITION同while 進入條件
:CONDITION 爲false 退出條件
:CONDITION 爲true
循環控制語句continue
continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層爲第1層
while CONDTIITON1; do CMD1 ... if CONDITION2; then continue fi CMDn ... done
循環控制語句break
break [N]:提前結束第N層循環,最內層爲第1層
while CONDTIITON1; do CMD1 ... if CONDITION2; then break fi CMDn ... done
循環控制shift命令
用於將參量列表list 左移指定次數,缺省爲左移一次。
參量列表list 一旦被移動,最左端的那個參數就從列表中刪除。while循環遍歷位置參量列表時,常用到shift。 ./doit.sh a b c d e f g h
./shfit.sh a b c d e f g h
#!/bin/bash # Name: doit.sh # Purpose: shift through command line arguments # Usage: doit.sh [args] while[ $# -gt 0 ] # or (( $# > 0 )) do echo $* shift done
#!/bin/bash #step through all the positional parameters until[-z "$1"] do echo "$1" shift done echo
創建無限循環
while true;do 循環體 done
until false;do 循環體 done
while的特殊用法
while循環的特殊用法(遍歷文件的每一行):
while read line; do 循環體 done < /PATH/FROM/SOMEFILE
依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line
for的特殊用法
雙小括號方法,即((…))格式,也可以用於算術運算
雙小括號方法也可以使bash Shell實現C語言風格的變量操作
I=10
((I++))
for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式)) do 循環體 done
控制變量初始化:僅在運行到循環代碼段時執行一次
控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而後再做條件判斷
例如:
for((i=0;i<=20;i++)) do echo "Helllo I am $i" done
select循環與菜單
select variable in list do 循環體命令 done
select 循環主要用於創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,並顯示PS3 提示符
,等待用戶輸入。
用戶輸入菜單列表中的某個數字,執行相應的命令
用戶輸入被保存在內置變量REPLY
中
select與case
select 是個無限循環,因此要記住用break命令退出循環,或用exit命令終止腳本。也可以按ctrl+c 退出循環。
select 經常和case 聯合使用
與for 循環類似,可以省略in list,此時使用位置參量
示例:
PS3="please input numbert: " select menu in 羊肉湯 米飯 胡辣湯 餃子 拉麪 燴麪 quit;do case $REPLY in 1) echo "羊肉湯,the price is 15." ;; 2) echo "米飯,the price is 12." ;; 3) echo "胡辣湯,the price is 30." ;; 4) echo "餃子,the price is 20." ;; 5) echo "拉麪,the price is 12." ;; 6) echo "燴麪,the price is 10." ;; 7) break ;; esac done
信號捕捉trap
trap '觸發指令' 信號 自定義進程收到系統發出的指定信號後,將執行觸發指令,而不會執行原操作 trap '' 信號 忽略信號的操作 trap '-' 信號 恢復原信號的操作 trap -p 列出自定義信號操作
示例:
#!/bin/bash trap 'echo "signal:SIGINT"' int trap -p for((i=0;i<=10;i++)) do sleep 1 echo $i done trap '' int trap -p for((i=11;i<=20;i++)) do sleep 1 echo $i done trap '-' int trap -p for((i=21;i<=30;i++)) do sleep 1 echo $i done