此代码有什么问题?如果输入数字 25 ,它将输出失败,而不是大声笑。我想念什么吗?
read -p "Enter number : " num
if [ `expr $num > 5` ]
then
echo "lol"
else
echo "failed"
fi
答案 0 :(得分:4)
代码
if [ `expr $num > 5` ]
实际上并不想让您思考。它将运行expr $num > 5
,因此评估参数并将其重定向到名为5
的文件(“在名为5的文件中放入25”),而if
将评估前一个的返回码表达。
如果要检查的代码评估数字是否大于5,请替换
if [ `expr $num > 5` ]
使用
[ "$num" -gt 5 ]
-gt
代表greater than
答案 1 :(得分:3)
@babtistemm的答案为您提供了建议的解决方案,但是如果由于某些原因您坚持使用(有点陈旧)的expr
:
read -p "Enter number : " num
if expr "$num" '>' 5 >/dev/null
then
echo "lol"
else
echo "failed"
fi
注意:
您需要引用>
,以便外壳程序不会将其解释为重定向stdout
。您也可以使用\>
。
优良作法是在$num
上加上双引号,这样expr
会将其解释为 one 表达式,从而限制了非常严重的错误或恶意用户入侵您的程序。 (最好是在使用$num
之前进行健全性检查,例如检查它是否为整数。)
此解决方案需要调用一个新进程expr
,与仅使用test
shell命令相比,该进程从OS中花费了更多资源。
如果省略>/dev/null
,则还会打印0
或1
(意思是false
或true
),{ stdout
中的{1}}。但与此无关,expr
根据表达式的结果设置退出状态expr
,然后由$?
对其进行测试。 (附带说明:如果您在调用if
之后尝试echo $?
,可能首先会感到惊讶,expr
表示退出状态为真/成功,而$? = 0
表示退出状态按惯例是false。)
答案 2 :(得分:2)
您可以在bash中使用算术表达式:
if (( num > 5 )); then ...
在手册中,请参见https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs
答案 3 :(得分:0)
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