Bash Shell 中的條件表示式

Niraj Menon 2023年1月30日 2022年5月11日
  1. Bash 中的 if 語句
  2. 內建 Bash 條件
Bash Shell 中的條件表示式

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 參考手冊

  1. -f 檢查檔案是否存在並且它是一個普通檔案。
  2. -d 檢查提供的引數是否是目錄。
  3. -h 檢查提供的引數是否是符號連結。
  4. -s 檢查檔案是否存在且不為空。
  5. -r 檢查檔案是否可讀。
  6. -w 檢查檔案是否可寫。
  7. -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

其他這樣的二運算元標誌如下。

  1. -ef 確保兩個引數引用相同的裝置和 inode 號。
  2. != 確保兩個引數不相等。
  3. < 檢查第一個引數是否按字母順序排在第二個引數之前。
  4. > 檢查第一個引數是否按字母順序排在第二個之後。
  5. -eq 假設兩個引數都是整數並檢查它們是否相等。
  6. -ne 假設兩個引數都是整數並檢查它們是否不相等。
  7. -lt 假設兩個引數都是整數並檢查第一個小於第二個。可以使用 -le 檢查它們是否相等。
  8. -gt 假定兩個引數都是整數並檢查第一個是否大於第二個。可以使用 -ge 檢查它們是否相等。

相關文章 - Bash Condition