expr和如果在bash中

问题描述 投票:3回答:4

这段代码出了什么问题?如果我输入数字25,则输出失败而不是lol。我错过了什么吗?

read -p "Enter number : " num
if [ `expr $num > 5` ] 
then 
echo "lol" 
else 
echo "failed" 
fi
bash comparison arithmetic-expressions
4个回答
4
投票

代码

if [ `expr $num > 5` ] 

实际上并不想让你想到。它将运行expr $num > 5,因此评估参数并将其重定向到名为5的文件(“将25放在名为5的文件中”),if将评估前一个表达式的返回码。

如果代码用于检查评估数字是否大于5,则替换

if [ `expr $num > 5` ] 

[ "$num" -gt 5 ]

-gt代表greater than


3
投票

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

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

笔记:

  1. 你需要引用>,以便shell不会将其解释为重定向stdout。你也可以使用\>
  2. 最好在$num中添加双引号,以便expr将其解释为一个表达式,从而限制非常糟糕的错误或恶意用户攻击您的程序的机会。 (最好在使用之前对$num进行健全性检查,例如检查它是否为整数。)
  3. 这个解决方案需要调用一个新进程expr,它比使用test shell命令从操作系统中获得更多资源。
  4. 如果你省略>/dev/null,你也会得到01印刷(意思是falsetrue),stdoutexpr。但独立于此,expr根据表达的结果确定其退出状态$?,然后由if测试。 (旁边的一句话:如果你在打电话给echo $?之后尝试expr,那么$? = 0首先表示真实/成功作为退出状态可能会出人意料,并且$? != 0在惯例上意味着错误。)

2
投票

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

if (( num > 5 )); then ...

在手册中,请参阅https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs


0
投票

Same in a short line:

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
© www.soinside.com 2019 - 2024. All rights reserved.