考虑以下:
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
两个函数的值。现在看看
这里应该发生什么?
-z
测试是假的,对吧?所以return 1
不执行。相反,函数返回什么?每个函数最后都返回 的值$?
。在这种情况下,该值为 1,即&&
列表的结果。您可能想要测试的是
相比
当非空时,这两个
if
语句的退出状态为零,因为没有一个语句的分支被采用。$m
从POSIX 标准:
请注意,我们可能会将您的两个功能都压缩为
在这里,我们让
grep
调用者提供退出状态。我们也不一定要将file.txt
文件读到最后,grep -q
只要找到匹配项就退出。