我无法进行数值比较:
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。
如何将数字转换为一种类型以进行真正的比较?
我无法进行数值比较:
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。
如何将数字转换为一种类型以进行真正的比较?
当前回答
单线解决方案。
a=2
b=1
[[ ${a} -gt ${b} ]] && echo "true" || echo "false"
gt参考:https://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
&&参考:https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html
[[…]]构造引用:https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b
${}引用:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02 (2.6.2)
参数展开格式如下:${表达式}其中表达式由匹配的“}”之前的所有字符组成。由或在带引号的字符串中转义的任何“}”,以及嵌入式算术扩展、命令替换、,在确定匹配“}”。参数展开的最简单形式是:${参数}
其他回答
还有一件好事,有些人可能不知道:
echo $(( a < b ? a : b ))
此代码将打印a和b中的最小数字
如果你有浮点数,你可以写一个函数然后使用它。例如
#!/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
单线解决方案。
a=2
b=1
[[ ${a} -gt ${b} ]] && echo "true" || echo "false"
gt参考:https://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
&&参考:https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html
[[…]]构造引用:https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b
${}引用:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02 (2.6.2)
参数展开格式如下:${表达式}其中表达式由匹配的“}”之前的所有字符组成。由或在带引号的字符串中转义的任何“}”,以及嵌入式算术扩展、命令替换、,在确定匹配“}”。参数展开的最简单形式是:${参数}
在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
希望这有帮助!