这段代码出了什么问题?如果我输入数字25,则输出失败而不是lol。我错过了什么吗?
read -p "Enter number : " num
if [ `expr $num > 5` ]
then
echo "lol"
else
echo "failed"
fi
代码
if [ `expr $num > 5` ]
实际上并不想让你想到。它将运行expr $num > 5
,因此评估参数并将其重定向到名为5
的文件(“将25放在名为5的文件中”),if
将评估前一个表达式的返回码。
如果代码用于检查评估数字是否大于5,则替换
if [ `expr $num > 5` ]
同
[ "$num" -gt 5 ]
-gt
代表greater than
@ babtistemm的答案为您提供了建议的解决方案,但如果您出于某种原因坚持使用(有点旧)expr
:
read -p "Enter number : " num
if expr "$num" '>' 5 >/dev/null
then
echo "lol"
else
echo "failed"
fi
笔记:
>
,以便shell不会将其解释为重定向stdout
。你也可以使用\>
。$num
中添加双引号,以便expr
将其解释为一个表达式,从而限制非常糟糕的错误或恶意用户攻击您的程序的机会。 (最好在使用之前对$num
进行健全性检查,例如检查它是否为整数。)expr
,它比使用test
shell命令从操作系统中获得更多资源。>/dev/null
,你也会得到0
或1
印刷(意思是false
或true
),stdout
的expr
。但独立于此,expr
根据表达的结果确定其退出状态$?
,然后由if
测试。 (旁边的一句话:如果你在打电话给echo $?
之后尝试expr
,那么$? = 0
首先表示真实/成功作为退出状态可能会出人意料,并且$? != 0
在惯例上意味着错误。)你可以在bash中使用算术表达式:
if (( num > 5 )); then ...
在手册中,请参阅https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs
read -p 'Enter a number: ' num
(( num > 5 )) && echo lol || echo fail
可以浓缩:
read -p 'Enter a number: ' num;((num>5))&&echo lol||echo fail
如果第一个命令成功,这个语法将起作用!
read -p 'Enter a number: ' num
((num > 5)) && {
echo lol
/bin/wrongcommand
:
} || echo fail
可以输出:
lol
bash: /bin/wrongcommand: No such file or directory
但是由于fail
(:
的别名)没有true
将会取得成功。
您当然可以将命令失败:
read -p 'Enter a number: ' num
((num > 5)) && {
echo lol
/bin/wrongcommand
:
} || {
echo fail
other command
}
可写:
read -p 'Enter a number: ' num;((num>5))&&{ echo lol;/bin/wrongcommand;:;}||{ echo fail;other command;}
你可以在{
和;}
之间分组命令(在第一次{
之后关心空间!)
Enter a number: 4
fail
bash: other: command not found
Enter a number: 7
lol
bash: /bin/wrongcommand: No such file or directory