我现在正在学习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 ]
阻止?
答案 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中被认为是真的
答案 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 test
。 if
除了检查后续命令的return命令外什么都不做,[
是test
的别名。
查看test
的手册页,您会发现如果您提供的表达式只是一个字符串,则默认测试字符串是否为非零长度。
如果您要测试 numeric 值为零的测试,那么必须使用 [ $? -eq 0 ]
还值得注意的是,bash不是C,尤其是返回码为零被解释为true
而非零值被false
。