expr,如果在bash中

时间:2018-09-01 11:01:09

标签: bash comparison arithmetic-expressions

此代码有什么问题?如果输入数字 25 ,它将输出失败,而不是大声笑。我想念什么吗?

read -p "Enter number : " num
if [ `expr $num > 5` ] 
then 
echo "lol" 
else 
echo "failed" 
fi

4 个答案:

答案 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

注意:

  1. 您需要引用>,以便外壳程序不会将其解释为重定向stdout。您也可以使用\>

  2. 优良作法是在$num上加上双引号,这样expr会将其解释为 one 表达式,从而限制了非常严重的错误或恶意用户入侵您的程序。 (最好是在使用$num之前进行健全性检查,例如检查它是否为整数。)

  3. 此解决方案需要调用一个新进程expr,与仅使用test shell命令相比,该进程从OS中花费了更多资源。

  4. 如果省略>/dev/null,则还会打印01(意思是falsetrue),{ 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