我正在学习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
块?
7条答案
按热度按时间laawzig21#
将 any 字符串传递给
test
命令,即[
成功了。所以呢相当于
或
你可以使用算术上下文,并说:
或者,使用
test
命令:jchrr9hc2#
如果你想让它在0的情况下执行else块,那么你必须设置它,使条件不是0。
由于bash中的变量被认为是一个字符串,使用算术运算符(-ne,-gt,-eq)等,将使其作为一个数字。
在C中,你必须将其设置为int/bool,以便在0时使用equate为false。
ljsrvy3e3#
请尝试[[测试语句,
至少以下内容将起作用:
为什么其他人不会工作,那么这是因为
类似于:
if [ $? ] or if [ "$var" ]
在bash中被认为是true
[For difference between the [ and [
bwleehnv4#
我发现考虑
if
不测试真假而是测试成功或失败更容易。这使得零的影响更容易调和,因为零被定义为成功。在Bash中,
true
和:
是内置的(不是常量或文字),并且都给予了成功。如果使用
test
命令[ ]
(甚至[[ ]]
),则值将解析为字符串:给出True。
但是,如果使用
arithmetic
测试(( ))
,则zero * 为 *“false”:给出False
如果你仔细想想,这和C的行为是一样的,其中
'0'
(aconst char
)将给予true,但0
(anint
)将给出false。这就是为什么如果你想在C中得到一个二进制0char
,你可以使用'\0'
。Ruby语言中的0(字符串或数字)作为true(只有nil和false不是true)。
6vl6ewon5#
试试这个
31moq8wy6#
我建议你运行
man test
。if
除了检查后续命令的返回命令外什么也不做,[
是test
的别名。查看
test
的手册页,您会发现如果输入的表达式只是一个字符串,则默认情况下会测试该字符串是否具有非零长度。如果要测试 numeric 值为零的测试,则必须使用 *
[ $? -eq 0 ]
同样值得注意的是,bash不是C语言,特别是返回值为零的代码被解释为
true
,非零值被解释为false
。rqmkfv5c7#
如果你在传统的数学意义上测试单个值,那么
expr
可以代替test
完成这项工作: