在bash中进行数值测试的方法有哪些?

时间:2010-08-06 07:07:22

标签: bash numbers testing

假设我在bash中有变量“x”。如何测试它是否为某个数字?

我尝试了if x=5; then echo "it is 5"; fi,但这不起作用,

然后我尝试了if x==5; then echo "it is 5"; fi,但这也行不通,

然后我尝试了if [x==5]; then echo "it is 5"; fi,但这也行不通,

然后我尝试了if [[x==5]]; then echo "it is 5"; fi,但这也行不通,

然后我尝试了if [[x=5]]; then echo "it is 5"; fi,但这也行不通,

然后我尝试了if [x=5]; then echo "it is 5"; fi,但这也行不通,

然后我尝试了if [x -eq 5]; then echo "it is 5"; fi,但这也行不通,

然后我尝试了if [[x -eq 5]]; then echo "it is 5"; fi,它终于奏效了。

我迷路了。 Bash似乎很糟糕。为什么这么多方法不起作用?只有最后一个呢?

无法使用if x==5; then ...; fi语法?

谢谢,Boda Cydo

7 个答案:

答案 0 :(得分:2)

尝试:

if [ "$x" = 5 ]; then echo "it is 5"; fi

请注意[本身就是一个命令;您可能会发现它与您系统上的test符号链接。因此,man test会告诉您如何使用它。特别是在它之后放一个空格很重要。

答案 1 :(得分:2)

Bash不能采用“if x == 5”语法来获得您想要的语义,因为它已经是具有不同含义的有效语法。 '如果x == 5;然后 ...; fi'当前将x设置为值'= 5',然后执行后面的命令。

就你的第一个问题而言,我建议完全避免使用括号表示法。只是做

if test "$x" = 5; then
...
fi

另请注意,“如果测试x = 5”,总是为假,因为这是文字字符串'x'和文字字符串'5'的比较。您需要使用$ x来获取变量的值。

答案 2 :(得分:1)

bash中的变量应该在它们之前有一个$ - if [${x} -eq 5]也应该有效。

答案 3 :(得分:1)

sh语法实际上非常灵活,并且很有可能获得您想要的语法。例如,如果你想能够编写“if x == 5”,你只需要意识到sh将通过调用带有参数'=='和'5'的名为'x'的命令来评估该字符串,并且对该函数返回的值作出反应。对于任何类型的生产设置,以下内容可能不是一个好主意,但了解其工作原理可能是有益的:

#!/bin/sh

declare() {
    eval $1'() {
    case $# in
        0) test $'$1';;
        1) false;;
        *) case $1 in
            =) shift; 
            '$1'=$(expr $*);;
            ==) test "$'$1'" = $2;;
            .=) '$1'="$'$1'$2";;
            +=) '$1'=$(expr $'$1' + $2);;
            -=) '$1'=$(expr $'$1' - $2);;
            *) false;;
        esac
    esac
    }'
}

declare x
x = 5
if x == 4; then echo not printed; fi  
if x == 5; then echo x = $x; fi  # "x = 5"
x += 2;
if x == 5; then echo not printed; fi  
if x == 7; then echo x = $x; fi  # "x = 7"
x = foo
x .= bar
echo x = $x                      # "x = foobar"
x = 4 + 5
echo x = $x                      # "x = 9"

上述脚本的输出是:

x = 5
x = 7
x = foobar
x = 9

答案 4 :(得分:0)

您可能会找到第7.1章。在Advanced Bash-Scripting Guide帮助中测试构造。

答案 5 :(得分:0)

  

如果x == 5,则不能采用bash;然后 ...; fi语法?

在Bash中,您可以使用此语法,它允许您省略美元符号并避免使用-eq,因此它最接近您要使用的内容:

if (( x == 5 ))

如果您愿意,甚至可以省略空格:

if ((x==5))

答案 6 :(得分:0)

你可以使用case / esac

case "$x" in
 5) echo "x is 5";;
esac