假设我在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
答案 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