shell 之 test 命令
1. test 命令
test 命令提供了在 if-then 語句中測試不同條件的途徑。如果 test 命令中列出的條件成立,test 命令就會退出並返回退出狀態碼0;如果條件不成立,test 命令就會退出並返回退出狀態碼1,這樣 if-then 語句就會失效。
test 命令的格式非常簡單:
test condition
condition 是 test 命令要測試的一系列引數和值。當用在 if-then 語句中時,test 命令看起來是這樣的:
if test condition; then
commands
fi
bash shell 提供了另一種在 if-then 語句中宣告 test 命令的方法:
if [ condition ]; then
commands
fi
方括號定義了 test 命令中用到的條件。注意,你必須在左括號右側和右括號左側各加一個空格,否則會報錯。
test 命令可以判斷3類條件:
1. 數值比較
2. 字串比較
3. 檔案比較
數值比較
test 命令的數值比較功能
比較 | 描述 |
---|---|
n1 -eq n2 | 檢查 n1 是否等於 n2 |
n1 -ge n2 | 檢查 n1 是否大於或等於 n2 |
n1 -gt n2 | 檢查 n1 是否大於 n2 |
n1 -le n2 | 檢查 n1 是否小於或等於 n2 |
n1 -lt n2 | 檢查 n1 是否小於 n2 |
n1 -ne n2 | 檢查 n1 是否不等於 n2 |
注意:test 命令中不能使用浮點數。
字串比較
test 命令的字串比較功能
比較 | 描述 |
---|---|
str1 = str2 | 檢查 str1 是否和 str2 相同 |
str1 != str2 | 檢查 str1 是否和 str2 不同 |
str1 < str2 | 檢查 str1 是否比 str2 小 |
str1 > str2 | 檢查 str1 是否比 str2 大 |
-n str1 | 檢查 str1 的長度是否非 0 |
-z str1 | 檢查 str1 的長度是否為 0 |
字串比較的三大注意事項:
1. 比較的變數最好加上雙引號。
2. 大於小於符號必須轉義,否則 shell 會把它們當做重定向符號而把字串值當做檔名。
3. 大於小於順序和 sort 命令所採用的不同。
#!/usr/bin/env bash
val1=$1
val2=$2
if [ "$val" \> "$val2" ];then
echo $val1
else
echo $val2
fi
# 變數不加雙引號回報錯:
# test.sh: line 6: [: >: unary operator expected
在 test 命令中大寫字母會被當成小於小寫字母的。但將同樣的字串放進檔案中並用 sort 命令排序時,小寫字母會先出現。這是由各個命令使用的排序技術不同造成的。test 命令會使用標準的 ASCII 順序,根據每個字元的 ASCII 數值來決定排序順序。sort 命令使用的是系統的本地化語言設定中定義的排序順序。
# sh test.sh Test test
test
---------
file.txt:
Test
test
---------
# sort file.txt
test
Test
檔案比較
test命令的檔案比較功能
比較 | 描述 |
---|---|
-d file | 檢查 file 是否存在並是一個目錄 |
-e file | 檢查 file 是否存在 |
-f file | 檢查 file 是否儲存並是一個檔案 |
-r file | 檢查 file 是否存在並可讀 |
-s file | 檢查 file 是否存在並非空 |
-w file | 檢查 file 是否存在並可寫 |
-x file | 檢查 file 是否存在並可執行 |
-O file | 檢查 file 是否存在並屬於當前使用者所有 |
-G file | 檢查 file 是否存在並且預設組與當前使用者相同 |
file1 -nt file2 | 檢查 file1 是否比 file2 新 |
file1 -ot file2 | 檢查 file1 是否比 file2 舊 |
2. 複合條件測試
if-then 語句允許使用布林邏輯來組合測試:
- 與:[ condition1 ] && [ condition2 ] 或者 [ condition1 -a condition2 ]
- 或:[ condition1 ] || [ condition2 ] 或者 [ condition1 -o condition2 ]
- 非:[ !condition ]
3. if-then 的高階特性
if-then 語句中使用的高階特性:
- 用於數學表示式的雙尖括號。
- 用於高階字串處理功能的雙方括號。
使用雙尖括號
使用雙尖括號格式:
((expression))
雙尖括號命令符號
符號 | 描述 |
---|---|
val++ | 後增 |
val– | 後減 |
++val | 先增 |
–val | 先減 |
! | 邏輯求反 |
~ | 位求反 |
** | 冪運算 |
<< | 左位移 |
>> | 右位移 |
& | 位布林與 |
| | 位布林或 |
&& | 邏輯與 |
#!/usr/bin/env bash
val1=$1
val2=$2
if (($val1 ** 2 > 100));then
((val2 = $val1 ** 2))
echo $val2
else
echo $val2
fi
使用雙方括號
雙方括號命令提供了針對字串比較的高階特性:
[[ expression ]]
雙尖括號裡的 expression 使用了 test 命令中採用的標準字串進行比較。但它提供了 test 命令未提供的另一個特性——模式匹配(Pattern Matching)。
定義正則表示式匹配:
#!/usr/bin/env bash
val=$1
# 匹配所有以 r 開頭的字串
if [[ $val = r* ]];then
echo $val
else
echo "Don't match"
fi
4. case 命令
為單個變數尋找特定的值,可以用 case 命令,而不是寫那麼多的 elif 語句檢查。case 命令會檢查單個變數列表格式的多個值:
case variable in
pattern1 | pattern2)
commands1
;;
pattern3)
commands2
;;
*)
default commands
;;
esac
case 命令會將指定的變數同不同模式進行比較。如果變數和模式是匹配的,那麼 shell 會執行為該模式指定的命令。也可以通過豎線操作符來分割模式,在一行列出多個模式。星號會捕獲所有跟所有列出的模式都不匹配的值。
#!/usr/bin/env bash
read -p 'Enter what you want: ' USER
case $USER in
rich | barbara)
echo "Welcome $USER"
echo 'Enjoy your visit'
;;
testing)
echo "Special testing acount"
;;
jessica)
echo "Don't forget to log off"
;;
*)
echo "Sorry, you aren't allowed here"
;;
esac