總第3篇
幾乎所有的編程語言中都有流程控制的概念,即順序結構、選擇結構和循環結構。
選擇結構也稱分支結構,比如C類語言中的**if**和 **switch**語句。
## if的條件
前面我已經講過了test表達式及其簡化版 [? ] 運算符的使用,這些判斷的語句即可作為if結構的條件。
Bash shell中我們可以使用的任何能夠有真假判斷功能的命令(無論是內部命令,還是外部命令)都可以作為判斷的條件。
**注意if和[ ]之間要有空格。if [ ... ]**
## 基本結構
Bash中的if同樣支持與if配對的else 和 else if的概念,只不過,else if在這里寫法是 elif。
if語句基本結構是這樣:
~~~
if <條件1>
then
語句1
elif <條件2>
語句2
elif <條件...>
語句...
else
語句n
fi
~~~
注意if語句中并無尖括號< >。用你的條件表達式來替換掉 <條件> 這部分。
實際根據你的需要使用elif和else。因為Bash不同于C語言,他沒有使用花括號來閉合一個作用域的寫法。Bash的if語句閉合作用域使用的是 if 的“反語”——fi。
這是個有趣的現象,之后我們還會見到類似的寫法。
關于 then,if的條件后面都需要加一個保留字then。你也可以把它們寫作同一行,但是需要注意的是要用分號來分隔,這些bash解釋器才知道then不是if條件的一部分。否則會報錯。
~~~
if <條件>;then
~~~
## 寫法舉例
### test及 [? ]條件
輸入一個數字,并判斷是否小于100
~~~
#!/bin/bash
read -p "請輸入一個數字:" a
if [ $a -lt 100 ]
then
echo "a<100"
else
echo "a>=100"
fi
~~~
判斷當前目錄下一個文件是否存在,若存在判斷是否為目錄文件。
~~~
#!/bin/bash
read -p "請輸入一個文件名:" name
if [ -e $name ]
then
echo -n "$name存在,"
if [ -d $name ]
then
echo "并且是一個目錄"
else
echo "但不是一個目錄"
fi
else
echo "$name不存在"
fi
~~~
### 其他命令作為條件
判斷當前環境中是否安裝了某一命令。
~~~
#!/bin/bash
read -p "請輸入一個命令:" var
if which $var>/dev/null
then
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強大的基礎。
## if與邏輯表達式
與其他語言一樣,Bash中的if同樣可以和 與或非 組合使用。并且通過結合內部或外部的命令一起使用,能夠達到其他語言達不到的效果。
比如:
~~~
if [ -e $filename ] && rm $filename
then
echo "$filaname 不存在!"
fi
~~~