bash中的expr和if

bash中的expr和if,bash,comparison,arithmetic-expressions,Bash,Comparison,Arithmetic Expressions,这个代码怎么了?如果我输入数字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将计算上一个表达式的返回码 如果

这个代码怎么了?如果我输入数字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` ] 


-gt
代表
大于

@babtistemm的答案为您提供了建议的解决方案,但如果您出于某种原因坚持使用(稍旧的)
expr

read -p "Enter number : " num
if expr "$num" '>' 5 >/dev/null
    then 
        echo "lol" 
    else 
        echo "failed" 
fi
注:

  • 您需要引用
    ,以便shell不会将其解释为重定向
    标准输出。您也可以使用
    \>

  • 最好将双引号添加到
    $num
    中,以便
    expr
    将其解释为一个表达式,从而限制出现严重错误或恶意用户入侵程序的机会。(最好在使用前对
    $num
    进行一次完整性检查,例如检查它是否为整数。)

  • 此解决方案需要调用一个新进程,
    expr
    ,这比仅使用
    test
    shell命令从操作系统花费更多的资源

  • 如果省略
    /dev/null
    ,您还将得到一个
    0
    1
    (意思是
    false
    true
    ),
    expr
    stdout
    。但是独立于此,
    expr
    根据表达式的结果设置其退出状态,
    $?
    ,然后由
    if
    测试。(旁注:如果您在调用
    expr
    后尝试
    echo$?
    ,首先可能会意外地发现
    $?=0
    表示退出状态为true/success,而
    $?!=0
    按惯例表示false。)


  • 可以在bash中使用算术表达式:

    if (( num > 5 )); then ...
    
    在手册中,请参见短行中的相同内容: 可以浓缩为:

    read -p 'Enter a number: ' num;((num>5))&&echo lol||echo fail
    
    如果first命令成功,此语法将起作用

    read -p 'Enter a number: ' num
    ((num > 5)) && {
          echo lol
          /bin/wrongcommand
          :
     } || echo fail
    
    可以输出:

    lol
    bash: /bin/wrongcommand: No such file or directory
    
    但是没有任何
    失败
    ,因为
    (是
    true
    的别名)将永远成功

    当然,您可以将失败的命令分组:

    可以这样写:

    read -p 'Enter a number: ' num;((num>5))&&{ echo lol;/bin/wrongcommand;:;}||{ echo fail;other command;}
    
    您可以在
    {
    ;}
    之间对命令进行分组(注意第一个
    {
    后面的空格!)


    if
    不计算上一个表达式的返回代码。这里失败的原因是
    expr
    输出被重定向到文件名
    5
    ,因此
    expr
    不会向stdout输出任何内容。如果调用是
    expr$num+5
    则代码将回显
    “lol”
    您缺少一个空格:
    [“$num”-gt 5]
    。只有
    $num
    是参数;
    expr 25
    的输出将写入名为
    5
    的文件。检查输入是否正确也是一个好主意,这样用户提供的数据就不会生成语法无效的代码(可能容易被利用)。例如:
    如果expr“${num}”:“[0-9][0-9]*$”&&expr“$num”>'5>/dev/null;那么
    当然,上面的代码是100%易受攻击的。我担心恶意用户可能会在脚本权限下执行任何代码,即使您将第一个操作数引用为
    “$num”
    @ghoti您对引号的看法是正确的,但我认为正则表达式对于OP的问题来说是过分的。@tif除非
    expr
    公开了一种执行代码的方法,如果参数被引用,您就不会受到攻击。请参阅:。另请参阅:在Unix和Linux SE上以及。
    lol
    bash: /bin/wrongcommand: No such file or directory
    
    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