问题:
我无法让数值比较工作正常:
bash
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 中,你可以在算术语境中进行比较:
bash
if (( a > b )); then
echo "a is greater than b";
fi
对于不支持 (())
的 POSIX shell,可以使用 -lt
和 -gt
。
咱们看以下示例代码:
bash
# 比较两个数字的大小
a=10
b=20
if [ $a -gt $b ]; then
echo "$a is greater than $b"
else
echo "$a is not greater than $b"
fi
# 比较一个数字和一个字符串的大小
c=30
d="30"
if [ $c -lt $d ]; then
echo "$c is less than $d"
else
echo "$c is not less than $d"
fi
除此之外,整数还可以用以下操作符进行比较:
- -eq: 等于
- -ne: 不等于
- -le: 小于等于
- -ge: 大于等于
你可以使用命令 help test
或 man test
获得比较操作符的完整列表及释义。
如果将表达式放在 [[ ]]
和 [ ]
中,进行整数比较时不要使用运算符 >
<
:
bash
root@linux:~# a=9
root@linux:~# b=10
root@linux:~# if (( $a < $b )) ; then echo "$a < $b"; fi
9 < 10
root@linux:~# if [[ $a > $b ]] ; then echo "$a > $b"; fi
9 > 10
root@linux:~# if [ $a > $b ] ; then echo "$a > $b"; fi
9 > 10
其中后面两次比较都是将变量 a
和 b
当作字符串按字典顺序进行排序比较的,所以执行结果跟我们的预期结果不一致。
参考:
- stackoverflow question 18668556
- help test
相关阅读: