我对Bash
测试表达式和if
测试命令感到有点困惑:
(1)
#!/bin/bash
count=90
if [ $((count)) ]; then
echo "True "
else
echo "False"
fi
执行它:
# ./test1.sh
True
(2)
#!/bin/bash
count=90
if $((count)); then
echo "True "
else
echo "False"
fi
执行它:
# ./test2.sh
./test2.sh: line 5: 90: command not found
False
(3)
#!/bin/bash
count=90
if ((count)); then
echo "True "
else
echo "False"
fi
执行它:
# ./test3.sh
True
我的问题如下:
a)对于test2.sh
,为什么会抱怨" command not found
"?
b)虽然test1.sh
和test3.sh
会输出相同的结果,但它们在if
条件下的含义是否相同?
答案 0 :(得分:3)
任何不会产生错误的内容都有效。
也就是说,人们在编写shell脚本时会遵循一些惯例,它们的存在主要是因为它们有意义。
if
命令是一个构造:
例如,您的系统上有名为true
和false
的程序。所以你可以创建一个if
结构,如:
if true; then
echo TRUE
else
echo FALSE
fi
当你将条件包装在方括号中时#34;在shell中,您真正做的是运行名为[
的命令。它可能是shell中的内置函数,也可能位于/bin/[
,但无论哪种方式都是命令。它的选项看起来像条件,其目的是产生一个将由if
命令使用的退出值。
现在......当您在bash中进行算术运算时,可以使用$((...))
之类的结构,称为" 算术扩展"因为算术的结果被扩展为替换表达式,就好像它是一个变量。当您使用((...))
而没有前面的美元符号时,表达式只是被评估,而不是打印。
所以..你的第一个if
命令测试看到算术扩展的计算结果为true。最有效的算术应该这样做。您的第二个命令执行扩展,就好像它是一个命令,而不是。并且您收到错误消息,告诉您90
无法作为命令运行。并且您的第三个命令执行算术,但不扩展它。与第一个选项一样,只要算法有效,测试返回true。
第一个和第三个变体之间的区别在于,在第一种情况下,test
命令(又名/bin/[
或您的shell的内置等效项)正在评估结果你的算术,其结果总是正确的,除非你做一些愚蠢的事情,比如尝试使用十进制数,而在第三种情况下,导致0
(零)的有效算术表达式似乎是&# 34;假"
要测试shell中的这种差异,请尝试以下操作:
$ if [ $(( 2.5 + 2 )) ]; then echo yes; else echo no; fi # ERROR
$ if (( 2.5 + 2 )); then echo yes; else echo no; fi # ERROR, no
$ if [ $(( 2 + 2 )) ]; then echo yes; else echo no; fi # yes
$ if (( 2 + 2 )); then echo yes; else echo no; fi # yes
$ if [ $(( 2 - 2 )) ]; then echo yes; else echo no; fi # yes
$ if (( 2 - 2 )); then echo yes; else echo no; fi # no
这两种行为都可能是您正在寻找的行为,但您尚未指出您尝试解决的问题,因此我无法推荐其中一种。