Bash

bash 中 if [ … 和 test … 語句的區別

  • October 12, 2021

考慮以下:

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應為已執行的thenelse複合列表的退出狀態,如果未執行,則為零。


請注意,我們可能會將您的兩個功能都壓縮為

is_match () {
   grep -q -F -e "$1" file.txt
}

在這裡,我們讓grep呼叫者提供退出狀態。我們也不一定要將file.txt文件讀到最後,grep -q只要找到匹配項就退出。

引用自:https://unix.stackexchange.com/questions/671795