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

在bash中进行数值测试的方法有哪些?,bash,numbers,testing,Bash,Numbers,Testing,假设bash中有变量“x”。我如何测试它是否是某个数字 我尝试了如果x=5;然后呼应“它是5”;fi但这不起作用 然后我尝试如果x==5;然后呼应“它是5”;fi但这也不起作用 然后我尝试了如果[x==5];然后呼应“它是5”;fi但这也不起作用 然后我尝试了if[[x==5]];然后呼应“它是5”;fi但这也不起作用 然后我尝试了if[[x=5]];然后呼应“它是5”;fi但这也不起作用 然后我尝试如果[x=5];然后呼应“它是5”;fi但这也不起作用 然后我尝试了if[x-eq 5];然后呼

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

我尝试了
如果x=5;然后呼应“它是5”;fi
但这不起作用

然后我尝试
如果x==5;然后呼应“它是5”;fi
但这也不起作用

然后我尝试了
如果[x==5];然后呼应“它是5”;fi
但这也不起作用

然后我尝试了
if[[x==5]];然后呼应“它是5”;fi
但这也不起作用

然后我尝试了
if[[x=5]];然后呼应“它是5”;fi
但这也不起作用

然后我尝试
如果[x=5];然后呼应“它是5”;fi
但这也不起作用

然后我尝试了
if[x-eq 5];然后呼应“它是5”;fi
但这也不起作用

然后我尝试了
if[[x-eq 5]];然后呼应“它是5”;fi
,它终于起作用了

我迷路了。巴什似乎是地狱。为什么这么多方法都不起作用?只有最后一个做了

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


谢谢,bash中的Boda-Cydo变量前面应该有一个$if[${x}-eq 5]。

试试:

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

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

您可能会发现第7.1章中的test构造非常有用。

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

关于你的第一个问题,我建议你完全避免使用括号符号,只要这样做就行了

if test "$x" = 5; then ... fi 如果测试“$x”=5,则 ... fi 还请注意,“if test x=5”将始终为false,因为这是文本字符串“x”和文本字符串“5”的比较。您需要使用$x来获取变量的值

如果x==5,bash不能采用;那么…;fi语法

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

if (( x == 5 ))
如果愿意,您甚至可以省略空格:

if ((x==5))
您可以使用case/esac

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

sh语法实际上非常灵活,很有可能得到您想要的语法,您只需要认识到sh将通过调用名为“x”的命令(参数为“==”和“5”)来计算该字符串,并对该函数返回的值作出反应。以下内容对于任何类型的生产设置可能都不是一个好主意,但了解其工作原理可能会有所帮助:

#!/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" #!/bin/sh 声明(){ 估价$1'(){ 案例$#in 0)测试$'$1';; 1) 假的;; *)每箱1元 =)移位; “$1”=$(expr$*);; ==)测试“$”$1'=$2;; .=) '$1'="$'$1'$2";; +=)'$1'=$(expr$'$1'+$2);; -=)'$1'=$(expr$'$1'-$2);; *)假的;; 以撒 以撒 }' } 申报x x=5 如果x==4;则未打印回显;fi 如果x==5;则echo x=$x;fi#“x=5” x+=2; 如果x==5;则未打印回显;fi 如果x==7;则echo x=$x;fi#“x=7” x=foo x.=巴 echo x=$x#“x=foobar” x=4+5 echo x=$x#“x=9” 上述脚本的输出为:

x = 5 x = 7 x = foobar x = 9 x=5 x=7 x=foobar x=9
然而,在bash中,
[
测试
是内置的。
/usr/bin/test
命令几乎相同,但有一些差异。因此,请参考
帮助[
帮助测试
,而不是
人工测试
。谢谢。但是引用是为了什么?为什么引用
“$x”
?@bodacydo:Quoting
“$x”
可以防止
$x
为空时出现语法错误。@bodacydo:Quoting
$x
包含空格和其他可以由shell解释的字符时也可以防止出现问题。始终引用所有变量扩展是一种很好的做法。不,这样不行。
后面必须有空格[
]
之前的一个:
如果[${x}-eq 5]
如果[$x-eq 5]
谢谢,我以前不知道这个!