玩轉Bash指令碼:選擇結構之if,bash指令碼
幾乎所有的程式設計語言中都有流程式控制制的概念,即順序結構、選擇結構和迴圈結構。
選擇結構也稱分支結構,比如C類語言中的 if 和 switch語句。
if的條件
前面我已經講過了test運算式及其簡化版 [ ] 運算子的使用,這些判斷的語句即可作為if結構的條件。
Bash shell中我們可以使用的任何能夠有真假判斷功能的命令(無論是內部命令,還是外部命令)都可以作為判斷的條件。
基本結構
Bash中的if同樣支援與if配對的else 和 else if的概念,只不過,else if在這裡寫法是 elif。
if語句基本結構是這樣:
if <條件1>then 語句1elif <條件2> 語句2elif <條件...> 語句...else 語句nfi
注意if語句中並無角括弧< >。用你的條件運算式來替換掉 <條件> 這部分。
實際根據你的需要使用elif和else。因為Bash不同於C語言,他沒有使用花括弧來閉合一個範圍的寫法。Bash的if語句閉合範圍使用的是 if 的“反語”——fi。
這是個有趣的現象,之後我們還會見到類似的寫法。
關於 then,if的條件後面都需要加一個保留字then。你也可以把它們寫作同一行,但是需要注意的是要用分號來分隔,這些bash解譯器才知道then不是if條件的一部分。否則會報錯。
if <條件>;then
寫法舉例test及 [ ]條件
輸入一個數字,並判斷是否小於100
#!/bin/bashread -p "請輸入一個數字:" aif [ $a -lt 100 ]then echo "a<100"else echo "a>=100"fi
判斷目前的目錄下一個檔案是否存在,若存在判斷是否為目錄檔案。
#!/bin/bashread -p "請輸入一個檔案名稱:" nameif [ -e $name ]then echo -n "$name存在," if [ -d $name ] then echo "並且是一個目錄" else echo "但不是一個目錄" fielse echo "$name不存在"fi
其他命令作為條件
判斷當前環境中是否安裝了某一命令。
#!/bin/bashread -p "請輸入一個命令:" varif which $var>/dev/nullthen echo "$var存在"else echo "$var不存在"fi
這個指令碼,我命名為var.sh,請看它的執行結果
另外還有一點要注意。在c語言中,0為假,非0為真。而在Bash中正好相反。
不信你就在終端執行一下,which pwd這個命令。然後再使用 echo $?看看這個命令的執行狀態(或者理解為返回值)。
可以發現,echo $?的結果是0。而執行了which delete這個命令,再使用echo $?可以發現它的輸出是1。
當然了,除了which以外還有許多內部或外部的命令可以和 if 結構組合使用,和外部命令的無縫整合是Bash以及其他Shell強大的基礎。
bash shell 指令碼的if語句塊中怎更改if語句塊之外的變數值
if 條件陳述式中沒有"=="這樣的寫法,如果是數值應該這樣寫:
if [ $a -eq $b ] 注意空格
若$a,$b為字串,則應該這樣寫
if [ "$a" = "$b" ] 注意空格
怎不用指令檔直接bash執行if語句?
在命令終端裡,直接按照你寫出來的一行行地敲,
每敲完一行後按斷行符號,
系統檢測到語句沒結束,會用>符號提示你繼續敲的,直到那你敲完 fi 後斷行符號,系統檢測到if語句正常結束了才會執行。