Bash 初學者系列 7:bash 中的條件語句(if else)
在 bash 中使用 if 語句
在絕大多數編程語言中,if 語句都是最基本的條件語句。在 bash 中其語法如下:?
if 語句以 fi(與if相反)結束。
注意空格:
- 在開始括號之后,與結束括號之前,都必須要有一個空格,否則 shell 將報錯;
- 條件運算符(=,==,<=等)前后必須有空格,否則將報錯。
我們創(chuàng)建一個示例腳本 root.sh,當你以 root 身份運行該腳本的時候,才會進入 if 語句:?
whoami 命令輸出當前用戶名。在 ??bash 變量???教程中,我們介紹了 $(command) 結構的語法用于命令替換。
所以,當你以 root 用戶身份登錄時,條件 $(whoami) = 'root' 才為真。
if-else 語句
上述代碼中,如果當前用戶不是 root,將看不到任何輸出。當 if 條件為 false 的時候,需要將其執(zhí)行的代碼放到 else 語句中,如下所示:
此時,當你以普通用戶運行腳本的時候,會輸出 You are not root,如下所示:?
使用 else if 語句
當有多個表達式(條件)時,可以使用 elif(else-if)語句??聪旅娴睦樱覀儎?chuàng)建一個名為 age.sh 的腳本:?
上述代碼中的 -lt 即小于(less than)。在前面的文章中我們介紹過如何給 ??bash 腳本傳遞參數???,現在我們運行一下 age.sh,并傳遞不同的參數:?
需要注意的是,在條件語句中,可以有多個 elif ,但是只能有一個 else,且必須使用 fi 關閉。
在 bash 中嵌套使用 if 語句
if 語句可以嵌套使用??慈缦?weather.sh 腳本:?
上述腳本接受溫度作為參數,然后顯示一條反應天氣情況的信息。當溫度大于 5 度的時候,就會進入嵌套的 if 語句。我們運行一下該腳本:?
在 bash 中使用 case 語句
我們還可以在 bash 中使用 case 語句來替換多個 if 語句,其構造的一般語法如下:?
注意:
- 條件語句最后總會包含一個空格和右括號 );
- 條件語句后的命令以兩個分號 ;; 結束,其前面的空格可有可沒有;
- case 語句 以 esac 結尾(與 case 相反)。
case 語句在處理模式匹配或正則表達式的時候特別有用。作為演示,我們創(chuàng)建一個名為 char.sh 的腳本:?
上述腳本接受一個字符作為參數,并顯示該字符是大寫字母,還是小寫字母、數字還是特殊字符。?
上述腳本中我使用了通配符 * 來定義默認字符,它相當于 if 語句中的 else 語句。
bash 中的測試條件
有許多測試條件可以與 if 語句一起使用。如果使用數字、字符串或文件,測試條件會有所不同。將它們視為bash中的邏輯運算符。
下表列出一些最常用的測試條件:
條件 | 相當于 |
$a -lt $b | $a < $b |
$a -gt $b | $a > $b |
$a -le $b | $a <= $b |
$a -ge $b | $a >= $b |
$a -eq $b | $a 等于 $b |
$a -ne $b | $a 不等于 $b |
-e $FILE | $FILE 存在 |
-d $FILE | $FILE 存在且是一個目錄. |
-f $FILE | $FILE 存在且是一個常規(guī)文件. |
-L $FILE | $FILE 存在且是一個軟鏈接. |
$STRING1 = $STRING2 | $STRING1 等于 $STRING2 |
$STRING1 != $STRING2 | $STRING1 不等于 $STRING2 |
-z $STRING1 | $STRING1 是空的 |
上面這些測試條件不需要專門記,可以在 man 手冊中查看:
我們創(chuàng)建一個名為 filetype.sh 的腳本,用來檢查文件是常規(guī)文件、目錄還是軟鏈接:?
在腳本的開始,我們檢查一下參數的數量,如果沒有參數或者有多個參數,腳本會輸出一條消息并退出。下面是運行情況:?
在同一行中編寫 if else 語句
到目前為止,我們上述代碼都是在規(guī)范的縮進格式下寫的,這是一種規(guī)范的寫法,但并不是非這樣寫不可。
當你只想在 shell 中看到結果時,可以在單行中使用 if else 語句。
假設我們有如下腳本:?
可以在一行代碼中這樣寫:
大家可以運行一下上面的腳本,看看結果。
基本上,就是在命令結束后添加分號 ; ,然后寫下一條語句。