shell if [ 0 ]返回true,为什么?

njthzxwz  于 2023-06-06  发布在  Shell
关注(0)|答案(7)|浏览(152)

我正在学习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块?如何为if [ 0 ]执行else块?

laawzig2

laawzig21#

any 字符串传递给test命令,即[成功了。所以呢

if [ 0 ]

相当于

if [ 1 ]

if [ foobar ]

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

if ((var)); then

或者,使用test命令:

if [ $var -eq 0 ]; then
jchrr9hc

jchrr9hc2#

如果你想让它在0的情况下执行else块,那么你必须设置它,使条件不是0。
由于bash中的变量被认为是一个字符串,使用算术运算符(-ne,-gt,-eq)等,将使其作为一个数字。
在C中,你必须将其设置为int/bool,以便在0时使用equate为false。

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

ljsrvy3e3#

请尝试[[测试语句,
至少以下内容将起作用:

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

为什么其他人不会工作,那么这是因为
类似于:
if [ $? ] or if [ "$var" ]
在bash中被认为是true

[For difference between the [ and [

bwleehnv

bwleehnv4#

  • 在C语言(我相信任何语言)*:这就是你的问题

我发现考虑if不测试真假而是测试成功或失败更容易。这使得零的影响更容易调和,因为零被定义为成功。
在Bash中,true:是内置的(不是常量或文字),并且都给予了成功。
如果使用test命令[ ](甚至[[ ]]),则值将解析为字符串:

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

给出True
但是,如果使用arithmetic测试(( )),则zero * 为 *“false”:

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

给出False
如果你仔细想想,这和C的行为是一样的,其中'0'(a const char)将给予true,但0(an int)将给出false。这就是为什么如果你想在C中得到一个二进制0 char,你可以使用'\0'
Ruby语言中的0(字符串或数字)作为true(只有nil和false不是true)。

6vl6ewon

6vl6ewon5#

试试这个

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

31moq8wy6#

我建议你运行man testif除了检查后续命令的返回命令外什么也不做,[test的别名。
查看test的手册页,您会发现如果输入的表达式只是一个字符串,则默认情况下会测试该字符串是否具有非零长度。
如果要测试 numeric 值为零的测试,则必须使用 * [ $? -eq 0 ]
同样值得注意的是,bash不是C语言,特别是返回值为零的代码被解释为true,非零值被解释为false

rqmkfv5c

rqmkfv5c7#

如果你在传统的数学意义上测试单个值,那么expr可以代替test完成这项工作:

if expr 0; then echo TRUE; else echo FALSE; fi

相关问题