shell腳本編程——流程控制
目 錄
一、 if
二、 case
三、 for
四、 while
五、 until
六、 綜合應用
一、if
1、語法
(1)單分支
if 判斷條件;then
fi
(2)雙分支
if 判斷條件; then
條件爲真的分支代碼
else
條件爲假的分支代碼
fi
(3)多分支
if 判斷條件1; then
條件爲真的分支代碼
elif 判斷條件2; then
條件爲真的分支代碼
elif 判斷條件3; then
條件爲真的分支代碼
else
以上條件都爲假的分支代碼
fi
逐條件進行判斷,第一次遇爲“真”條件時,執行其分支,而後結束整個if語句
2、例子1:編寫腳本,實現如下功能:當輸入的是自然數,提示是自然數,如果輸入不是,則提示,輸入不是自然數。
#!/bin/bash # --------------------------------------------------------------- # Filename:checkint.sh # Revision: 1.0 # Date: 2017-09-12 # Author: gm # Website: # Description:check int # ------------------------------------------------------------- read -p "please input number: " num if [[ "$num" =~ [^[:digit:]] ]];then echo "The number is not a int" else echo "The number is a int" fi
解釋:如果輸入的數中匹配到了數字以外的字符,則提示不是自然數,其他情況,則提示是自然數。
執行結果:
二、case
1、語法
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默認分支
;;
esac
case支持glob風格的通配符:
*: 任意長度任意字符
?: 任意單個字符
[]:指定範圍內的任意單個字符
a|b: a或b
2、例子2:寫出菜單,當用戶輸入菜單編號,則顯示出價格
#!/bin/bash # ------------------------------------------ # Filename: menu.sh # Revision: 1.0 # Date: 2017-9-11 # Description: cai dan # ------------------------------------------ echo "menu 1.tang 2.rice 3.fruit 4.jiaozi 5.lamian 6.huimian " read -p "plaese input your food number: " num case $num in 1|4) echo The price is 20 ;; 2|5) echo The price is 12 ;; 3|6) echo The price is 10 ;; *) echo Please input again ;; esac
解釋:通過讀取用戶輸入的數字;如果是1或4 ,提示The price is 20 。因爲2號商品和4號商品價格一樣,可以寫在一起。case支持glob風格。當不滿足以上三個case時,用*)表示出以上情況,其他的輸入都提示 Please input again
執行結果:
三、for
1、語法
for 變量名 in 列表;do
循環體
done
列表生成方式:
(1) 直接給出列表
例子3:打印1,2,3
#!/bin/bash # --------------------------------------------------------------- # Filename: a.sh # Revision: 1.0 # Date: 2017-09-17 # Author: gm # Website: # Description: echo 1,2,3 # ------------------------------------------------------------- for line in 1 2 3;do echo $line done
解釋:line是變量名,可以換成其他名
執行結果:
(2) 整數列表:
(a) {start..end}
例子4:計算1+2+3+...+100
#!/bin/bash # --------------------------------------------------------------- # Filename: aa.sh # Revision: 1.0 # Date: 2017-09-17 # Author: gm # Website: # Description:1+2+3+...+100 # ------------------------------------------------------------- sum=0 for i in {1..100};do let sum=sum+i done echo $sum
解釋:let 使用於變量的運算
執行結果:
(b) $(seq [start[step]] end)
例子5:計算1+2+3+...+100
#!/bin/bash # --------------------------------------------------------------- # Filename: bb.sh # Revision: 1.0 # Date: 2017-09-17 # Author: gm # Website: # Description: # ------------------------------------------------------------- sum=0 for i in `seq 1 100`;do let sum=sum+i done echo $sum
解釋:seq 1 100 顯示出1-100個數,$(command)或者`command` 引用命令執行的結果。$(seq 1 100)將命令執行的結果作爲列表
執行結果:
(3) 返回列表的命令
$(COMMAND)
(2)中的seq也是命令的引用
(4) 使用glob, 如: *.sh
例子6:依次顯示出/var/log/下所有以.log 結尾文件的行數
#!/bin/bash # --------------------------------------------------------------- # Filename: cc.sh # Revision: 1.0 # Date: 2017-09-17 # Author: gm # Website: # Description:/var/log/*.log # ------------------------------------------------------------- for file in /var/log/*.log;do wc -l $file done
執行結果:
(5) 變量引用;
$@, $*
#!/bin/bash # --------------------------------------------------------------- # Filename: dd.sh # Revision: 1.0 # Date: 2017-09-17 # Author: gm # Website: # Description:1+2+3+..+n # ------------------------------------------------------------- sum=0 for i in `seq 1 $1`;do let sum=sum+i done echo $sum
解釋:引用用戶輸入參數作爲列表,$1表示用戶輸入的第一個參數。更加的靈活,注意:這裏不能使用{1..$1},{}引用變量顯示不出來,可以用`seq 1 $1`。
執行結果:
四、while
1、語法
while CONDITION; do
循環體
done
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件爲“true”,則執行一次循環;直到條件測試狀態爲“false”終止循環
例子1:
#!/bin/bash # --------------------------------------------------------------- # Filename: ee.sh # Revision: 1.0 # Date: 2017-09-17 # Author: gm # Website: # Description: # ------------------------------------------------------------- while true;do echo "hello" done
解釋:true 一直爲真,所以會一直執行循環體,所以這是個死循環。而且執行後,最好立即按ctrl+c停下,這是個死循環,不會自己停下,最終會造成系統資源耗盡而四級
執行結果:由於執行速度太快,我迅速按下ctrl+c後已經向上翻不到執行腳本的命令了,執行腳本命令./dd.sh
例子2:計算1+2+3+…+100
#!/bin/bash # --------------------------------------------------------------- # Filename: ff.sh # Revision: 1.0 # Date: 2017-09-17 # Author: gm # Website: # Description: # ------------------------------------------------------------- i=1 sum=0 while [ $i -le 100 ];do let sum=sum+i let i++ done echo $sum
解釋:當i小於或等於100時,執行下面操作。
執行結果:
五、until
1、語法
until CONDITION; do
循環體
done
進入條件: CONDITION 爲false
退出條件: CONDITION 爲true
例子:當發現系統中有用戶名爲hacker ,立即讓該用戶退出登錄
#!/bin/bash # --------------------------------------------------------------- # Filename: login.sh # Revision: 1.0 # Date: 2017-09-13 # Author: gm # Website: # Description: test user login # ------------------------------------------------------------- until who|grep -q "^hacker\>";do sleep 1 done pkill -9 -u hacker
解釋:who|grep -q "^hacker\>" 查找用戶名爲hacker,當沒有找到時,一直循環,休眠1秒,sleep 1,一旦發現hacker用戶。直接讓用戶退出登錄,腳本執行完立即退出
執行結果:當登錄上hacker用戶後,
執行該腳本,立即執行完
再次查看hacker登錄,已經被踢出登錄
六、綜合應用
1、對於上面例子中的menu,用戶只能輸入一次就退出,這裏通過多種語法相結合,實現用戶多次輸入(while 與case結合)
#!/bin/bash # ------------------------------------------ # Filename:menu.sh # Revision: 1.0 # Date: 2017-9-11 # Description: caidan # ------------------------------------------ echo "menu 1.yangroutang 2.mifan 3.hulatang 4.jiaozi 5.lamian 6.huimian " while read -p "plaese input your food number(quit is exit): " num;do case $num in 1|4) echo The price is 20 ;; 2|5) echo The price is 12 ;; 3|6) echo The price is 10 ;; quit) exit ;; *) echo Please input again ;; esac done
執行結果:
2、打印棋盤(for 和case 結合)
#!/bin/bash # ------------------------------------------ # Filename:xiangqi.sh # Revision: 1.0 # Date: 2017-9-11 # Description: # ------------------------------------------ huang=`echo -e "\033[1;43m \033[0m"` lan=`echo -e "\033[1;44m \033[0m"` hong=`echo -e "\033[1;41m \033[0m"` for i in {1..24};do num=`echo $[($i-1)/3]` mo=$[num%2] case $mo in 0) for j in {1..4};do echo -n "$huang$lan" done echo ;; *) for j in {1..4};do echo -n "$lan$huang" done echo ;; esac done unset huang lan hong num
執行結果: