玩轉Bash指令碼 選擇結構之if

2021-06-25 17:44:18 字數 2139 閱讀 1893

幾乎所有的程式語言中都有流程控制的概念,即順序結構、選擇結構和迴圈結構。

選擇結構也稱分支結構,比如c類語言中的ifswitch語句。

前面我已經講過了test表示式及其簡化版 [  ] 運算子的使用,這些判斷的語句即可作為if結構的條件。

bash shell中我們可以使用的任何能夠有真假判斷功能的命令(無論是內部命令,還是外部命令)都可以作為判斷的條件。

注意if和[ ]之間要有空格。if [ ... ]

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
輸入乙個數字,並判斷是否小於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 "但不是乙個目錄"

fielse

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強大的基礎。

與其他語言一樣,bash中的if同樣可以和 與或非 組合使用。並且通過結合內部或外部的命令一起使用,能夠達到其他語言達不到的效果。

比如:

if [ -e $filename ] && rm $filename

then

echo "$filaname 不存在!"

fi

玩轉Bash指令碼 選擇結構之if

差點兒全部的程式語言中都有流程控制的概念。即順序結構 選擇結構和迴圈結構。選擇結構也稱分支結構,比方c類語言中的if和switch語句。前面我已經講過了test表示式及其簡化版 運算子的使用,這些推斷的語句就可以作為if結構的條件。bash shell中我們能夠使用的不論什麼能夠有真假推斷功能的命令...

玩轉Bash指令碼 迴圈結構之for迴圈

for 變數 in 取值列表 do 各種操作 done 還有罕見的寫法就是都寫作一行裡 for 變數 in 取值列表 do 各種操作 done 取值列表大致可以分成列舉和迭代兩類 取值列表為空格或回車符分割的字串 foriin meat sleep woman doecho i like i don...

玩轉Bash指令碼 迴圈結構之for迴圈

for迴圈 for 變數 in 取值列表 do 各種操作 done還有罕見的寫法就是都寫作一行裡 for 變數 in 取值列表 do 各種操作 done取值列表大致可以分成列舉和迭代兩類 取值列表為空格或回車符分割的字串 for i in apple meat sleep woman do echo...