关键字“if”如何测试值是否为false?

时间:2010-10-13 13:27:51

标签: bash shell ubuntu

在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

输出:否

但是echo "$word" | grep -q "$letter"将返回1,为什么结果为否。

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

3 个答案:

答案 0 :(得分:12)

检查命令的返回值。 [ 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'

答案 1 :(得分:9)

在unix land中,0为真,1为假。

第一个例子:

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

“如果”检查给定命令的退出代码是否为真/假(即零/非零)。

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

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

对于你的第二个例子,这输出“No”,因为在“Linux”中找不到“nuxi”,如果你将“nuxi”改为“nux”(也许这是一个错字?)并删除周围的空格=那么你将得到你期望的行为。 e.g。

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

答案 2 :(得分:0)

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

验证这一点

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