Bash Shell 中的條件表示式
Niraj Menon
2023年1月30日
2022年5月11日
Bash 作為一種程式語言並不是大多數程式設計師的首選,尤其是對於 Python 和 C 等更常見的語言。
編寫程式設計結構以使用 if 語句根據條件執行命令或使用 for
迴圈具有多個引數的同一命令會很有幫助。
本教程將介紹 Bash 中的 if 語句,重點介紹 if 語句中使用的各種條件表示式。
Bash 中的 if
語句
Bash 中 if
語句的一般語法如下。
if condition; then
do-if-true;
elif second-condition; then
do-else-if-true
elif third-condition; then
do-else-if-third-true
else
do-else-false
fi
條件本身可以有不同的語法,具體取決於所需的條件。
- 如果你想使用命令的輸出作為條件,例如
grep
檔案的內容以檢視它是否包含某個子字串,你可以將命令放在 if 關鍵字之後,如下所示。
if greq -q "string" file.txt; then
echo "string exists in file.txt."
else
echo "string does not exist in file.txt."
fi
[ "$s" = "string" ]
檢查變數$s
是否包含值string
。它也等價於test "$s" = "string"
,其中test
有效地替換了方括號。
if [ "$s" = "string" ]; then
echo "string is equivalent to \$s"
else
echo "string is not equivalent to \$s"
fi
-
你甚至可以執行算術運算,例如檢查檔案中的預期檔案數或行數是否確定,或者一個目錄中的數量是否小於或大於另一個目錄的數量。
我們用一對括號來做到這一點。
a=$(ls dir_a | wc -l)
b=$(ls dir_b | wc -l)
if (( a < b )); then
echo "Directory a has fewer files than directory b."
elif (( a > b )); then
echo "Directory a has more files than directory b."
else
echo "Directory a has the same number of files as that of directory b."
fi
內建 Bash 條件
有時,執行一個單獨的程式來檢查像檔案存在、修改日期和大小這樣簡單的事情是乏味且耗費資源的,因此 Bash 可以像 if 語句一樣直接檢查這些屬性。
以下標誌檢查這些屬性的存在或不存在,將有效的真或假結果返回給 if 語句。
例如,要檢查命令是否沒有輸出,我們可以將其輸出視為字串,並使用 -z
標誌檢查該字串的長度是否為零,如下所示。
out=$(bash print-if-error.sh)
if [[ -z $out ]]; then
echo "The script ran successfully."
else
echo "The script produced the following errors: "
echo $out
fi
要獲得條件的倒數,你可以使用!
NOT 運算子,或使用此標誌的相反形式,即 -n
,或根本沒有標誌,因為非空字串在 Bash if 語句中可以表現為真
。
out=$(bash print-if-error.sh)
if [[ $out ]]; then
echo "The script produced the following errors: "
echo $out
else
echo "The script ran successfully."
fi
下面解釋了一些其他有用的標誌,解釋參考了 GNU Bash 參考手冊。
-f
檢查檔案是否存在並且它是一個普通檔案。-d
檢查提供的引數是否是目錄。-h
檢查提供的引數是否是符號連結。-s
檢查檔案是否存在且不為空。-r
檢查檔案是否可讀。-w
檢查檔案是否可寫。-x
檢查檔案是否可執行。
對於帶有兩個引數的標誌,例如比較運算子,第一個引數出現在標誌之前,而第二個引數出現在標誌之後。
假設我們比較兩個檔案 - a.txt 和 b.txt - 看看哪個更新,帶有 -nt
標誌。反過來將檢查它是否更舊,使用 -ot
。
out=$(bash print-if-error.sh)
if [[ a.txt -nt b.txt ]]; then
echo "a.txt is newer than b.txt."
else
echo "a.txt is older or the same age as b.txt."
fi
其他這樣的二運算元標誌如下。
-ef
確保兩個引數引用相同的裝置和 inode 號。!=
確保兩個引數不相等。<
檢查第一個引數是否按字母順序排在第二個引數之前。>
檢查第一個引數是否按字母順序排在第二個之後。-eq
假設兩個引數都是整數並檢查它們是否相等。-ne
假設兩個引數都是整數並檢查它們是否不相等。-lt
假設兩個引數都是整數並檢查第一個小於第二個。可以使用-le
檢查它們是否相等。-gt
假定兩個引數都是整數並檢查第一個是否大於第二個。可以使用-ge
檢查它們是否相等。