如何理解bash中的条件?

时间:2016-03-14 06:33:27

标签: bash shell

我对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.shtest3.sh会输出相同的结果,但它们在if条件下的含义是否相同?

1 个答案:

答案 0 :(得分:3)

任何不会产生错误的内容都有效。

也就是说,人们在编写shell脚本时会遵循一些惯例,它们的存在主要是因为它们有意义。

if命令是一个构造:

  • 运行命令,然后根据该命令的退出代码
  • 运行
  • 运行其他命令。

例如,您的系统上有名为truefalse的程序。所以你可以创建一个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

这两种行为都可能是您正在寻找的行为,但您尚未指出您尝试解决的问题,因此我无法推荐其中一种。