【问题标题】:How does the keyword “if” test if a value is true or false?关键字“if”如何测试一个值是真还是假?
【发布时间】:2010-10-13 13:27:50
【问题描述】:

在 bash 脚本中

if [ 1 ]
then
   echo "Yes"
else
   echo "No"
fi

输出:Yes

表示将'1'视为真值。

但在代码中:

word = Linux
letter = nuxi
if echo "$word" | grep -q "$letter"
then
    echo "Yes"
else
    echo "No"
fi

输出:No

但是echo "$word" | grep -q "$letter"会返回1,那为什么结果是No

关键字if如何测试if之后的命令返回值?

【问题讨论】:

标签: bash shell ubuntu


【解决方案1】:

检查命令的返回值。 [ 1 ] 的返回值为 0 (true)。任何其他返回值(如1)都表示错误。

您可以使用$? 变量显示最后执行命令的返回值:

true
echo $?
# returned 0
false
echo $?
# returned 1
echo $?
# returned 0 as the last executed command is 'echo', and not 'false'

【讨论】:

  • 啊,是不是因为'['是shell内置的,完成测试功能会返回0?
  • 看起来0 是一个计算结果为true 的表达式。 [ 0 = 1 ] 的返回值为 1(预期值),[ 0 = 0 ] 的返回值为 0。运行man test 以获取有关test(又名[)的更多信息
  • [ 1 ][ 0 ] 计算结果为 true,因为带有单个参数的 test/[ 仅检查参数字符串(此处为 10)是否为非空。 iow [ "" ] 将是错误的。
【解决方案2】:

在 unix 领域,0 为真,1 为假。

对于您的第一个示例:

if [ 1 ]
then
   echo "Yes"
else
   echo "No"
fi

“If”检查给定命令的退出代码的真/假(即零/非零)。

方括号实际上调用了“test”命令(有关详细信息,请参阅“man test”)并将退出代码提供给 if。

“test 1”(或者实际上是“test any_string”)返回 true (0),因此输出“Yes”。

对于您的第二个示例,如果您将“nuxi”更改为“nux”(也许这是一个错字?)并删除围绕= 然后你会得到你期望的行为。例如

word=Linux
letter=nux
if echo "$word" | grep -q "$letter"
then
    echo "Yes"
else
    echo "No"
fi

【讨论】:

    【解决方案3】:

    这是因为 grep 未能在 $word 中找到 $letter,因此退出代码为 1。每当 linux 中的进程返回 0 以外的代码时,就意味着它失败了。 0 表示成功退出。您可以通过echo "Linux" | grep -d "nuxi"; echo $?验证这一点

    另一方面,在脚本世界中,0 表示假,1 表示真。因此 grep 未能找到该单词并将 1 作为退出代码发送给 if,if 将其视为真值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2022-08-18
      • 2020-11-16
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多