bash 中 if [ ... 和 test ... 语句的区别

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?

答案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一旦找到匹配项就会退出。

相关内容