Bash
bash 中 if [ … 和 test … 語句的區別
考慮以下:
echo "hello" > file.txt is_match1 () { local m m=$(cat "file.txt" | grep -F "$1") if [ -z "$m" ]; then return 1 fi } is_match2 () { local m m=$(cat "file.txt" | grep -F "$1") test -z "$m" && return 1 } is_match1 "hello" echo "$?" 0 is_match2 "hello" echo "$?" 1
為什麼
is_match2
返回 1?
根據您的問題,
m
獲取hello
兩個函式的值。現在看看
test -z "$m" && return 1
這裡應該發生什麼?
-z
測試是假的,對吧?所以return 1
不執行。相反,函式返回什麼?每個函式最後都返回 的值$?
。在這種情況下,該值為 1,即&&
列表的結果。您可能想要測試的是
if [ -z "$m" ]; then return 1; fi
相比
if test -z "$m"; then return 1; fi
當非空時,這兩個
if
語句的退出狀態為零,因為沒有一個語句的分支被採用。$m
從POSIX 標準:
命令的退出狀態
if
應為已執行的then
或else
複合列表的退出狀態,如果未執行,則為零。請注意,我們可能會將您的兩個功能都壓縮為
is_match () { grep -q -F -e "$1" file.txt }
在這裡,我們讓
grep
呼叫者提供退出狀態。我們也不一定要將file.txt
文件讀到最後,grep -q
只要找到匹配項就退出。