我无法进行数值比较:

echo "enter two numbers";
read a b;

echo "a=$a";
echo "b=$b";

if [ $a \> $b ];
then
    echo "a is greater than b";
else
    echo "b is greater than a";
fi;

问题是它比较了从第一位开始的数字,即9大于10,但1大于09。

如何将数字转换为一种类型以进行真正的比较?


当前回答

在Bash中,我更喜欢这样做,因为它更多地将自己作为一个条件操作来处理,而不是使用(()),后者更像是算术。

[[ n -gt m ]]

除非我做复杂的事情

(( (n + 1) > m ))

但每个人都有自己的喜好。可悲的是,有些人强加了他们的非官方标准。

您也可以这样做:

[[ 'n + 1' -gt m ]]

这允许你添加除算术以外的其他东西。

其他回答

在Bash中,您应该在算术上下文中进行检查:

if (( a > b )); then
    ...
fi

对于不支持(())的POSIX shell,可以使用-lt和-gt。

if [ "$a" -gt "$b" ]; then
    ...
fi

您可以通过帮助测试或人工测试获得比较运算符的完整列表。

在Bash中,我更喜欢这样做,因为它更多地将自己作为一个条件操作来处理,而不是使用(()),后者更像是算术。

[[ n -gt m ]]

除非我做复杂的事情

(( (n + 1) > m ))

但每个人都有自己的喜好。可悲的是,有些人强加了他们的非官方标准。

您也可以这样做:

[[ 'n + 1' -gt m ]]

这允许你添加除算术以外的其他东西。

除了以上所有答案之外:

如果在单个If语句中有多个表达式,可以执行以下操作:

if (( $a % 2 == 0 )) && (( $b % 2 != 0));
  then
  echo "What you want to do"
fi

希望这有帮助!

这样地:

#!/bin/bash

a=2462620
b=2462620

if [ "$a" -eq "$b" ]; then
  echo "They're equal";
fi

整数可以与以下运算符进行比较:

-eq # Equal
-ne # Not equal
-lt # Less than
-le # Less than or equal
-gt # Greater than
-ge # Greater than or equal

请参阅此备忘单。

如果你有浮点数,你可以写一个函数然后使用它。例如

#!/bin/bash

function float_gt() {
    perl -e "{if($1>$2){print 1} else {print 0}}"
}

x=3.14
y=5.20
if [ $(float_gt $x $y) == 1 ] ; then
    echo "do stuff with x"
else
    echo "do stuff with y"
fi