shell編程進階
流程控制主要是過程式編程語言,分為順序執行,選擇執行和循環執行。
條件選擇if語句
if語句分為單分支,雙分支和多分支三種,單分支只需輸入一段條件為真的分支代碼即可,而雙分支需要輸入兩段代碼,一段條件為真,一段條件為假,多分支更復雜,逐條進行判斷,第一次遇到真條件時,執行分支,然後fi結束整個if語句。
單分支: if 判斷條件;then 條件為真的分支代碼 fi 雙分支: if 判斷條件;then 條件為真的分支代碼 else 條件為假的分支代碼 fi fi
多分支: if 判斷條件1;then 條件為真的分支代碼 elif 判斷條件2;then 條件為真的分支代碼 elif 判斷條件3;then 條件為真的分支代碼 else 以上條件都為假的分支代碼 fi
示例:
編輯腳本/root/bin/fi1.sh,實現如下功能:輸入一個數字,當這個數字等於5時,輸出middle,當這個數字大於等於0小於5時,輸出small,當這個數字小於0時,輸出error,否則,輸出big。
#!/bin/bash if [ $1 -eq 5 ];then echo "middle" elif [ $1 -lt 5 -a $1 -ge 0 ];then echo "small" elif [ $1 -lt 0 ];then echo "error" else echo "big" fi
註:用【】進行條件判斷時要註意前中後都有空格,腳本編寫完成後不要忘了加執行權限,用.或source執行腳本。
2.條件判斷case語句
case語句是先引用一個變量,之後把每個判斷條件輸入各個分支中,以esac為結尾。
case 變量引用 in PAT1) 分支1 ;; PAT2) 分支2 ;; ... *) 默認分支 ;; esac
註:case支持glob風格的通配符:
*: 任意長度任意字符 ?: 任意單個字符 []:指定範圍內的任意單個字符 a|b: a或b
示例:
編輯腳本/root/bin/case1.sh,如果輸入的是boy,m,ae,n,male,則輸出 Gentleman,若是輸入的是 girl,wom,ae,n,female,則輸出Lady,否則,輸出Error。
#!/bin/bash case $1 in boy|m[ae]n|male)echo "Gentleman";; girl|wom[ae]n|female)echo "Lady";; *)echo "Error";; esac
註:每行代碼編寫完成後不要忘了“;;”。
循環執行是比較重要的部分。循環執行就是將某代碼段重復運行多次,有進入條件和退出條件。
3.for 循環
依次將列表中的元素賦值給“變量名”; 每次賦值後即執行一次循環體; 直到列表中的元素耗盡,循環結束
for 變量名 in 列表;do 循環體 done
列表生成方式:
(1) 直接給出列表
(2) 整數列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,如:*.sh
(5) 變量引用;
$@, $*
示例:
編輯腳本/root/bin/xin.sh,實現打印紅心矩形
#!/bin/bash for i in {1..10};do for n in {1..10};do echo -en '\033[31m?\033[0m' done echo done
註:for循環可以套其他的循環,其他的循環也可以套for循環
4.while循環
while 循環控制條件;do 循環體 done
實驗:把分區利用率大於10%的分區顯示 sda5 will be full : 30%
#!/bin/bash df |grep sd |while read disk ;do diskname=$(echo $disk |cut -d' ' -f1) diskusage=$(echo $disk |sed -r 's/.* ([0-9]+)%.*/\1/') [ $diskusage -ge 10 ] && echo "$diskname will be full: ${diskusage}%" done
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件
為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環
CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
進入條件:CONDITION為true
退出條件:CONDITION為false
while CONDITION; do 循環體 done
5.循環控制語句continue
用於循環體中
continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層
while CONDTIITON1; do CMD1 ... if CONDITION2; then continue fi CMDn ... done
示例:
運用while循環輸出1~9
while [ $n -lt 10 ];do echo $n let n++ if [ $n -eq 5 ];then continue fi done
6.循環控制語句break
用於循環體中
break [N]:提前結束第N層循環,最內層為第1層
while CONDTIITON1; do CMD1 ... if CONDITION2; then break fi CMDn ... done
7.until循環
進入條件: CONDITION 為false
退出條件: CONDITION 為true
until CONDITION; do 循環體 done
示例:
運用until循環輸出1~09
until [ $n -eq 10 ];do echo $n let n++ done
註:until循環語句條件判斷為假才能循環下去,跟while循環除了這個判斷條件其他都一樣。
8.循環控制語句shift
shift [n]
用於將參量列表 list 左移指定次數,缺省為左移一次。
參量列表 list 一旦被移動,最左端的那個參數就從列表中刪除。while 循環
遍歷位置參量列表時,常用到 shift
./doit.sh a b c d e f g h
示例:
doit.sh
#!/bin/bash # Name: doit.sh # Purpose: shift through command line arguments # Usage: doit.sh [args] while [ $# -gt 0 ] # or (( $# > 0 )) do echo $* shift done
shell編程進階