理解 Bash 的 If Else 和其他條件語句

寫一個Bourne Again Shell(Bash)腳本可以是一個有價值的經驗,尤其是當你為其增加邏輯以確保其穩健性時。一種將這種邏輯融入其中、使你的腳本更智能的方法是使用條件語句,具體來說就是“bash if else”。

在這次深入探討中,你將理解Bash if-else和case語句的威力和細微之處。這將幫助你創建無錯誤的智能Bash腳本。我們還會加入一些最佳實踐,確保你像專業人士一樣編寫腳本。

興奮嗎?開始吧,提升你的Bash腳本能力!

舞台設置:前提條件

為了充分利用本教程,你應該先擁有一些基本的東西:

  • A Linux or Windows system armed with Bash. For those on Windows, the Windows Subsystem for Linux (WSL) is your best bet.
  • A code/text editor to write and refine your ‘bash if else’ scripts.

為什麼應該利用bash if else語句?

為什麼在Bash腳本中,條件語句如此受人尊敬?簡單來說,它們賦予了你的腳本基於預定條件的決策能力。

例如,你可以使用“bash if else”在嘗試刪除文件之前驗證其是否存在。或者,你可能想查看用戶是否擁有必要的權限才允許他們訪問資源。

將腳本注入 ‘bash if else’ 結構不僅增加了其靈活性,還增強了其效力。 想像一個設計用於清理文件夾中所有文件的腳本。 使用 ‘bash if else’,您可以精確地刪除僅在30天以上的文件,保留其餘部分。

深入研究 ‘bash if else’ 語句

現在,讓我們不再介紹,開始動手。 我們將從最普遍被接受的條件語句之一開始:’bash if else’ 語句。

在其核心,’bash if else’ 是將條件插入到您的 Bash 腳本中的入口。 請觀察其優雅的語法如下:

  • 它以 if 關鍵字開始,後面跟著 [[ ]] 包裹的條件。 在此之後,執行 ‘bash if else’ 語句中的代碼,並以 fi 關鍵字結束。
  • then 關鍵字將條件與滿足條件時執行的操作(或語句)分開。 這個操作塊可以跨越多行,用分號 (;) 分隔。
if [[ condition ]]; then
	statement
fi

想像一下腳本化的登錄系統。 在授予訪問權限之前,它會提示輸入正確的用戶名:

1. 啟動終端並使用您喜歡的文本編輯器初始化一個新的 bash_if_demo.sh 文件。 這將是我們理解 ‘bash if else’ 語句的遊樂場。

nano bash_if_demo.sh

2. 將下面提供的“bash if else”示例嵌入到您的bash_if_demo.sh文件中。插入後,保存修改並退出編輯器。

示例“bash if else”腳本提示輸入用戶名。如果輸入了預期的用戶名,則顯示歡迎消息,並附帶當前日期和時間。

為了將用戶訪問嘗試的日期和時間記錄下來,可以將其用於未來的分析。

介紹行#!/bin/bash(通常稱為前言)指示系統使用哪個解釋器來處理腳本中的後續代碼。這裡,我們選擇了“bash”解釋器。

#!/bin/bash
# 將一個問題顯示在屏幕上。
echo "Whats your name?"
# 捕獲鍵盤輸入,將其存儲在$NAME變量中
read NAME
# 開始“bash if else”語句-檢查$NAME變量中的值
# 是否與“ATA”匹配。如果匹配,則執行括號內的代碼。如果不匹配,則跳過。
if [ $NAME == "ATA" ]
then
  # 只有當$NAME變量的值等於“ATA”時才顯示一條消息。
  echo "Welcome back ATA!"
fi
# 在“bash if else”之外,這總是顯示當前日期和時間。
date

3. 現在,讓我們測試一下我們的「bash if else」腳本。執行以下命令:

bash bash_if_demo.sh

請注意,無論您使用哪種Bash shell變體,都應以「bash」作為腳本名稱的前綴。這確保系統使用Bash來執行腳本。

輸入“ATA”並按Enter。結果應該類似於以下內容:

Demonstration of the bash_if_demo.sh ‘bash if else’ Script

如果您輸入的不是“ATA”,歡迎消息將不會顯示在輸出中。只會展示當前的日期和時間。這是由於「bash if else」語句檢查與$NAME變量中的值的精確匹配而產生的行為。

請注意,「bash if else」語句區分大小寫。因此,“ata”、“aTa”、“Ata”等都與“ATA”不同。

Outcome on Entering a Non-matching Value

請始終使用各種輸入來測試您的「bash if else」腳本。這確保腳本按預期運行。

深入挖掘:嵌套的「bash if else」語句

您已經掌握了製作「bash if else」語句的基本知識。儘管這基礎知識足以應對簡單的任務,但複雜的腳本通常需要高級結構。這就是嵌套的「bash if else」語句發揮作用的地方。基本上,它是一個包含一個或多個額外「if」語句的「if」語句。

下面的結構說明了嵌套「bash if else」語句的基本語法。在這裡,外部的if [[ 條件 ]]子句包含僅在滿足條件時可執行的代碼。在我們的上下文中,嵌套的代碼是另一個「if」語句。

  • if [[ 條件 ]] – 這代表外部的 ‘bash if else’ 敘述。嵌套的代碼(另一個 ‘if’ 敘述)僅在陳述的條件成立時才執行。
  • if [[ 條件2 ]] – 這代表內部的 ‘bash if else’ 子句。其中的代碼僅在兩個條件都滿足時才執行。
if [[ conditions ]]; then
	if [[ condition2 ]]; then
		statement
	fi
fi

讓我們深入探討。在加強我們之前的 ‘bash if else’ 範例時,現在我們將包括一個詢問密碼的 if 敘述:

1. 首先,使用您喜歡的文本編輯器建立一個名為 bash_nested_if_demo.sh 的新文件。

nano bash_nested_if_demo.sh

2. 將下面提供的 ‘bash if else’ 代碼轉移到 bash_nested_if_demo.sh 文件中,保存更改,然後關閉編輯器。

這個 ‘bash if else’ 代碼提示輸入名稱和密碼。如果名稱和密碼的條件符合,就會顯示特定的消息。如果不匹配,輸出只顯示當前的日期和時間。

#!/bin/bash
# 提出一條提示用戶輸入用戶名的消息。
echo "Whats your name?"
# 收集用戶輸入。
read NAME
# 開始'bash if else'語句以驗證$NAME是否匹配"ATA"。
if [ $NAME == "ATA" ]
 then
 # 提出後續問題,這次是關於密碼。
 echo "Password?"
 # 捕獲密碼輸入。
 read Password
   # 嵌套的'bash if else' - 確定$Password是否與"pwd123"相對應。
   if [ "$Password" == "pwd123" ]; then
     # 如果符合有關名稱和密碼的兩個條件,則顯示一條消息。
     echo "You've successfully logged in as ATA."
   fi
fi
# 強調當前日期和時間。
date

3. 現在,讓我們看看這個’bash if else’腳本的運行情況。執行以下命令:

bash bash_nested_if_demo.sh

為了獲得最佳結果,請將ATA作為用戶名輸入,並將pwd123作為密碼輸入。

Demonstrating the bash_nested_if_demo.sh Script in action

如果您的輸入與“ATA”或“pwd123”不符,您將只收到有關當前日期和時間的反饋。這是因為’bash if else’結構需要滿足兩個條件。

Validating if entered conditions are met using ‘bash if else’

解碼“Bash If Else”語句

‘Bash if else’語句是Bash腳本中的基石,為您的腳本提供了決定性的能力。然而,理解使用’if’語句並不是沒有缺點。

過度依賴「if」可能會讓您的代碼變得混亂,尤其是當涉及多個嵌套的「if」語句時,使其變得冗長且具有挑戰性。這樣的腳本有可能變成“意大利麵代碼”,其特點是讀取性降低且複雜度增加。

那麼,如何使您的「bash if else」腳本保持易於理解?選擇使用「if else」語句而不是一堆嵌套的「if」語句。「else」關鍵字提供了在「if」條件不滿足時指定要執行的代碼塊的便利性。

為了更清晰地了解,請考慮下面的「Bash If Else」語法,其中:

  • if [[ 條件 ]] – 在這裡,“bash if else”語句包括當所述條件有效時觸發的代碼(語句1)。
  • else – 這是「bash if else」結構的一部分。 else語句包含了在前一個if子句中的條件不滿足時執行的代碼(語句2)。
if [[ conditions ]]; then
	statement1
else
	statement2
fi

想像一下制作一個簡單的“bash if else”遊戲,系統期望從用戶那裡獲得一個隨機數:

1. 首先,創建一個名為bash_if_else_demo.sh的新文件。

nano bash_if_else_demo.sh

2. 將後續的「bash if else」代碼集成到您的bash_if_else_demo.sh文件中,保存修改,然後退出。

基本的“bash if else”代碼提示用戶輸入他們的幸運數字。如果輸入是偶數,它會顯示“您贏了!”消息。相反,奇數將觸發“您輸了!”輸出。

#!/bin/bash
# 廣播請求用戶的幸運數字
echo -n "Input Your Lucky Number:"
# 接受輸入的數字。
read var
# 'bash if else' 條件以確定值是否為偶數。
if [ $((var%2)) == 0 ]; then
 # 如果滿足條件,宣佈勝利
 echo "You Won with 'bash if else'!"
else
 # 如果條件不符,宣佈失敗
 echo "You Lost using 'bash if else'!"
fi

3. 要觀察 ‘bash if else’ 腳本的運作,執行以下命令:

bash bash_if_else_demo.sh

輸入偶數後,應該看到 “您使用 ‘bash if else’ 贏了!” 的消息。相反,輸入奇數應該會產生 “您使用 ‘bash if else’ 輸了!” 的反饋。

Run the ‘bash if else’ game, bash_if_else_demo.sh Script

要豐富 ‘bash if else’ 腳本,考慮加入一個段落,確定用戶輸入的是一個字母還是一個獨特字符,而不是一個數字。

解碼 ‘Bash If Else’ 和 Case 語句

到目前為止,您已經探索了在 Bash 腳本中做出決策的幾種方法,即 ‘bash if else’ 語句。但是 Bash 還提供了另一種做出決策的途徑——case 語句。

與 ‘bash if else’ 類似,case 語句擅長於根據指定條件執行代碼序列。與嵌套的 ‘bash if else’ 情景相比,case 語句的一個顯著優點是其極其簡潔和清晰。

為了充分理解「bash if else」的替代方案,讓我們深入研究case語句的語法:

  • case $VAR in – 這個case結構的片段將$VAR變量與定義的模式進行比較,直到找到匹配為止。
  • pattern1)pattern2) – 這些是要進行測試的標準,一旦檢測到匹配,相應的代碼(statement1statement2)將被執行。
  • esac – 結束case結構。
case $VAR in
pattern1)
    statement1
    ;;
pattern2)
    statement2
    ;;
esac

想像一下,你正在設計一個「bash if else」腳本,用戶輸入他們的國家名稱,腳本會顯示該國家的主要語言。

1. 開始生成一個名為bash_case_demo.sh的文件。

nano bash_case_demo.sh

2. 將以下提供的「bash if else」代碼嵌入到你的bash_case_demo.sh文件中,然後保存並退出。

隨後的「bash if else」腳本將提示用戶輸入他們國家的名稱,並根據「case」模式打印提及國家中使用的主要語言。

3#!/bin/bash
# 以問題詢問用戶有關其居住國家的查詢
echo -n "In which country do you reside?"
# 捕捉用戶的回答。
read var
# 根據'case'框架內的模式揭示用戶選擇的國家的標準語言 ($var)。
# 依賴'case'框架內的模式,揭示用戶選擇的國家的主要語言。
echo -n "The official language of $var is "

# 'bash if else' case語句評估用戶的輸入 ($var) 是否與模式相符。
case $var in
# 建立揭示用戶選擇的國家的主要語言的模式。
 US)
  echo -n "English"
  ;;

 Canada)
  echo -n "English and French"
  ;;

 Algeria | Bahrain | Egypt| Jordan)
  echo -n "Arabic"
  ;;

 *)
  echo -n "unknown"
  ;;
esac

3. 要親身體驗這個「bash if else」腳本,請使用以下命令:

bash bash_case_demo.sh

您將會發現該腳本能夠準確地根據用戶選擇的國家突顯語言。

如果提供的國家不符合指定的模式,將觸發默認(*)模式,結果輸出為「未知」。

Illustrating the functionality of the bash_case_demo.sh Script

總結Bash條件語句

在本指南中,您已經開始了解Bash中的「bash if else」和其他條件語句。從簡單的「if」語句到複雜的「if-else」和「case」語句,您現在已經具備了有效Bash腳本的基本工具。

擁有了這些「bash if else」基礎知識,您可以更加熟練地構建Bash腳本,減少錯誤的發生。

但請記住,這僅僅是冰山一角。Bash提供了大量的條件語句。也許,考慮深入研究Bash elif語句&&, OR和||運算符以獲得更深入的見解。通過奉獻精神,掌握Bash腳本編寫將很快成為可能!

Source:
https://adamtheautomator.com/bash-if-else/