if [0]返回true。为什么?

时间:2014-05-02 10:58:58

标签: bash shell if-statement

我现在正在学习shell脚本。无论如何,我运行以下程序。

#!/bin/bash
sudo rmmod my_driver
make clean
make
sudo insmod my_driver.ko   // return value is 0
var=$?
if [ $var ];
then
        echo " $var, not done!!"
else
        echo " $var, done!!"
fi

输出是,

...
make[1]: Leaving directory `/usr/src/kernels/2.6.32-431.11.2.el6.x86_64'
0, not done!!

在C语言中(我相信任何语言),如果if条件返回false,它将执行else阻止。

I tried below conditions too, but I faced same problem

if [ "$var" ]
if [ "$var" -eq "0" ]
if [ $var -eq 0 ]
if [ $? ]

为什么它没有执行else阻止? 如何为else执行if [ 0 ]阻止?

6 个答案:

答案 0 :(得分:7)

任何字符串传递给test命令,即[,都会成功。所以

if [ 0 ]

相当于

if [ 1 ]

if [ foobar ]

您可以使用算术上下文,并说:

if ((var)); then 

或使用test命令:

if [ $var -eq 0 ]; then

答案 1 :(得分:3)

如果你希望它执行else块,如果为0,那么你必须设置它以使条件为0以外的任何值。

由于bash中的变量被认为是一个字符串,因此使用算术运算符(-ne,-gt,-eq)等会使它作为数字插入。

在C中你必须将它设置为int / bool,以便在0时使用等于false。

if [[ $var -ne 0 ]];then
    echo " $var, not done!!"
else
    echo " $var, done!!"
fi

答案 2 :(得分:2)

请尝试[[test statement,

至少以下内容将起作用:

if [[ "$var" -eq "0" ]]
if [[ $var -eq 0 ]]

为什么其他人不会工作,那是因为

类似的东西:

if [ $? ] or if [ "$var" ]

在bash中被认为是真的

<强> For difference between the [ and [[

答案 3 :(得分:1)

试试这个,

[[ $var -ne 0 ]] && echo "$var, not done!!" || echo "$var, done!!"

答案 4 :(得分:1)

用C语言(我相信任何语言):这是你的问题。

我发现更容易认为if不会测试是真还是假,而是成功或失败。这样可以更容易地协调零的影响,因为零被定义为成功。

在Bash中,true:是内置函数(不是常量或文字),都可以成功。

如果您使用test命令[ ],(甚至[[ ]]),则值会解析为字符串:

echo "hello"
if [ $? ]
then
    echo "True"
else
    echo "False"
fi

提供 True

但是,如果您使用arithmetic测试(( )),那么零 “false”:

echo "hello"
if (( $? ))
then
    echo "True"
else
    echo "False"
fi

提供错误

如果您考虑一下,那就是与C相同的行为,其中'0'(一个const char)会给出真实,但0(一个int)会给出假。这就是为什么如果你想在C中使用二进制零char,你可以使用'\0'

零(字符串或数字)作为真的语言是Ruby(只有nil和false不是真的)。​​

答案 5 :(得分:0)

我建议你运行man testif除了检查后续命令的return命令外什么都不做,[test的别名。

查看test的手册页,您会发现如果您提供的表达式只是一个字符串,则默认测试字符串是否为非零长度。

如果您要测试 numeric 值为零的测试,那么必须使用 [ $? -eq 0 ]

还值得注意的是,bash不是C,尤其是返回码为零被解释为true而非零值被false