shell腳本之流程控制

 

 

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風格的通配符:

  1. *:任意長度任意字符
  2. ?:任意單個字符
  3. []:指定範圍內的任意單個字符
  4. a|b: ab

循環語句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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章