如何使用 Bash If 語句(4 個示例)

已發表: 2023-05-08
Linux 筆記本電腦顯示一個終端窗口,背景為地球圖案和二進制水印
fatmawati achmad zaenuri/Shutterstock
使用 Linux Bash if 語句構建具有if then fi結構的條件表達式。 為其他條件表達式添加elif關鍵字,或為定義一個包羅萬象的代碼部分添加else關鍵字,如果沒有執行先前的條件子句則執行該代碼。

所有重要的 Bash 腳本都需要做出決定。 Bash if 語句讓您的 Linux 腳本提出問題,並根據答案運行不同的代碼部分。 他們是這樣工作的。

什麼是條件執行?

在除最微不足道的 Bash 腳本之外的所有腳本中,執行流通常需要根據決定的結果在腳本中採用不同的路徑。 這稱為條件執行。

決定採用哪個執行分支的一種方法是使用if語句。 您可能會聽到if語句稱為if then語句,或者if then else語句。 它們是同一事物的不同名稱。

Linux Bash 腳本中 for 循環的 9 個示例
Linux Bash 腳本中 for 循環的相關9 示例

if語句表示如果某件事為真,則執行操作。 但如果某件事是假的,那就去做吧。 “某物”可以是很多東西,例如變量的值、文件的存在或兩個字符串是否匹配。

條件執行對於任何有意義的腳本都是至關重要的。 沒有它,您可以讓腳本執行的操作非常有限。 除非它可以做出有意義的決定,否則您將無法解決現實世界的問題並產生可行的解決方案。

if語句可能是最常用的獲得條件執行的方法。 下面是如何在 Bash 腳本中使用它。

相關:如何檢查文件是否存在於 Linux Bash 腳本中

一個簡單的 If 語句示例

這是最簡單的if語句的規範形式:

 如果 [ 這個條件為真 ]
然後
  執行這些語句
菲

如果文本中的條件解析為真,則執行then子句中的腳本行。 如果您正在查看其他人編寫的腳本,您可能會看到這樣寫的if語句:

 如果 [ 這個條件為真 ]; 然後
  執行這些語句
菲

需要注意的幾點:

  • if語句以寫fi結束。
  • 條件測試的第一個括號“ [之後和第二個括號“ ]之前必須有一個空格。
  • 如果您打算將then關鍵字與條件測試放在同一行,請確保使用分號” ; ” 測試後。

如果條件測試被證明為假,我們可以添加一個可選的else子句來執行一些代碼。 else子句不需要then關鍵字。

 如果 [ 這個條件為真 ]
然後
  執行這些語句
別的
  改為執行這些語句
菲

此腳本顯示了一個使用else子句的if語句的簡單示例。 條件測試檢查客戶的年齡是否大於或等於 21。如果是,則客戶可以進入場所, then執行 then 子句。 如果他們不夠大,則執行else子句,並且不允許他們進入。

 #!/bin/慶典

customer_age=25

如果 [ $customer_age -ge 21 ]
然後
  echo "進來吧。"
別的
  echo "你不能進來。"
菲

將上面的腳本複製到編輯器中,將其保存為名為“if-age.sh”的文件,然後使用chmod命令使其可執行。 您需要對我們討論的每個腳本執行此操作。

 chmod +x if-age.sh 

使用 chmod 使腳本可執行

讓我們運行我們的腳本。

 ./if-age.sh 

運行年齡變量設置為 25 的 if-age.sh 腳本

現在我們將編輯文件並使用小於 21 歲的年齡。

 customer_age=18

對您的腳本進行更改,並保存您的更改。 如果我們現在運行它,條件返回 false,然後執行 else 子句。

 ./if-age.sh 

運行年齡變量設置為 18 的 if-age.sh 腳本

elif 條款

elif子句添加了額外的條件測試。 您可以擁有任意數量的elif子句。 依次對它們進行評估,直到發現其中一個為真。 如果沒有一個elif條件測試證明為真,則執行else子句(如果存在)。

該腳本要求輸入一個數字,然後告訴您它是奇數還是偶數。 零是偶數,所以我們不需要測試任何東西。

所有其他數字都通過找到除以二的模數來測試。 在我們的例子中,模數是除以二的結果的小數部分。 如果沒有小數部分,則該數字可以被二整除。 因此它是偶數。

 #!/bin/慶典

echo -n "請輸入數字:"

讀號

如果 [ $number -eq 0 ]
然後
  echo "你輸入了零。零是偶數。"
elif [ $(($number % 2)) -eq 0 ]
然後
  echo "您輸入了 $number。它是一個偶數。"
別的
  echo "您輸入了 $number。它是一個奇數。"
菲

要運行此腳本,請將其複製到編輯器並將其另存為“if-even.sh”,然後使用 chmod 使其可執行。

讓我們運行腳​​本幾次並檢查其輸出。

 ./if-even.sh 

使用各種輸入運行 if-even.sh 腳本

這一切都很好。

不同形式的條件測試

我們用於條件測試的方括號“ [] ”是調用test程序的簡寫方式。 因此, test支持的所有比較和測試都可用於您的if語句。

這只是其中的幾個:

  • expression :如果表達式為假,則為真。
  • -n 字符串:如果字符串的長度大於零則為真。
  • -z 字符串:如果字符串的長度為零,則為真。 也就是說,它是一個空字符串。
  • string1 = string2 :如果 string1 與 string2 相同則為真。
  • string1 != string2 :如果 string1 與 string2 不同則為真。
  • integer1 -eq integer2 :如果 integer1 在數值上等於 integer2 則為真
  • integer1 -qt integer2 :如果 integer1 在數值上大於 integer2,則為真
  • integer1 -lt integer2 :如果 integer1 在數值上小於 integer2 則為真
  • -d 目錄:如果目錄存在則為真。
  • -e 文件:如果文件存在則為真。
  • -s 文件:如果文件存在且大小大於零則為真。
  • -r 文件:如果文件存在並且設置了讀取權限則為真。
  • -w 文件:如果文件存在並且設置了寫權限則為真。
  • -x 文件:如果文件存在並且設置了執行權限則為真。

在表中,“文件”和“目錄”可以包括相對或絕對目錄路徑。

等號“ = ”和等式檢驗-eq一樣的。 等號執行一個字符一個字符的文本比較。 相等性測試執行數值比較。

我們可以通過在命令行上使用test程序來看到這一點。

 測試“這個字符串”=“這個字符串”
 測試“這個字符串”=“那個字符串”
 測試 1 = 001
 測試 1 -eq 001

在每種情況下,我們都使用echo命令來打印最後一條命令的返回碼。 零表示真,一表示假。

在命令行中使用測試程序來測試不同的比較

使用等號“ = ”給我們一個比較 1 和 001 的錯誤響應。這是正確的,因為它們是兩個不同的字符串。 在數字上它們是相同的值——一個——所以-eq運算符返回一個真響應。

如果要在條件測試中使用通配符匹配,請使用雙括號“ [[ ]] ”語法。

 #!/bin/慶典

如果 [[ $USER == *ve ]]
然後
  迴聲“你好$USER”
別的
  echo "$USER 不以 've' 結尾"
菲

此腳本檢查當前用戶的帳戶名。 如果它以“ ve ”結尾,它會打印用戶名。 如果它不以“ ve ”結尾,腳本會告訴您,然後結束。

 ./if-wild.sh 

運行 if-wild.sh 腳本,在 if 語句的條件測試中顯示通配符搜索

相關: Bash 中的條件測試:if, then, else, elif

嵌套 If 語句

您可以將一個if語句放在另一個if語句中。

這是完全可以接受的,但是嵌套if語句會使代碼更難閱讀,更難維護。 如果您發現自己嵌套了兩層或三層以上的if語句,您可能需要重新組織腳本的邏輯。

下面是一個腳本,它以數字形式獲取一天,從一到七。 一是周一,七是周日。

它告訴我們商店的營業時間。 如果是工作日或星期六,它會報告商店營業。 如果是星期天,則報告商店關門。

如果商店開張,則嵌套的if語句進行第二次測試。 如果那天是星期三,它會告訴我們它只在早上開放。

 #!/bin/慶典

# 以數字 1..7 的形式獲取日期
天=$(日期+“%u”)

如果 [$day -le 6]
然後
  ##商店開門了
  如果 [ $day -eq 3 ]
  然後
    #週三是半天
    echo "星期三我們只在早上開門。"
  別的
    # 常規工作日和星期六
   echo “我們全天營業。”
  菲
別的
  #週日不營業
  echo "今天是星期天,我們不營業。"
菲

將此腳本複製到編輯器中,將其保存為名為“if-shop.sh”的文件,並使用chmod命令使其可執行。

我們運行腳​​本一次,然後將計算機的時鐘更改為星期三,然後重新運行腳本。 然後我們將這一天更改為星期日並再次運行它。

 ./if-shop.sh
 ./if-shop.sh
 ./if-shop.sh 

運行 if-shop.sh 腳本,計算機時鐘設置為工作日,然後是星期三,然後是星期日

相關:如何在 Linux 中使用雙括號條件測試

案例 For if

條件執行為編程和腳本編寫帶來了力量,不起眼的if語句很可能是在代碼中切換執行路徑的最常用方法。 但這並不意味著它總是答案。

編寫好的代碼意味著知道您有哪些選擇以及哪些是解決特定需求的最佳選擇。 if語句很棒,但不要讓它成為你包裡的唯一工具。 特別是,查看case語句,它在某些情況下可以作為解決方案。

相關:如何在 Bash 腳本中使用 Case 語句