首页 > 解决方案 > 为什么 bash 按字典顺序而不是数字方式评估数字的比较?

问题描述

有人可以解释 bash 的“ if ”块的以下行为吗?

我使用以下简单代码检查first_value是否小于second_value

first_value=67
second_value=2

if [[  "${first_value}" < "${second_value}" ]];
then 
    echo "Yes"
else 
    echo "No"
fi

问题是

如果second_value是 1,2,3,4,5,6,10,11,... 块将返回“No”

但如果second_value为 7,8,9,则该块将返回“Yes”(必须为“No”)

解决方法是使用“ -lt ”而不是“ < ”,但我想了解“ if ”块的这种行为。

bash 版本是“GNU bash,版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)”

操作系统是“CentOS Linux release 7.5.1804 (Core)”

标签: bashif-statementsyntax

解决方案


这种行为的原因是由于括号[[ "${first_value}" < "${second_value}" ]],实际上是字典比较。[[ exp ]]

正如问题中提到的OP,可能的解决方法是使用-lt运算符。

在 bash 中,您可以使用算术上下文:

if (( $first_value < $second_value ));
then 
    echo "Yes"
else 
    echo "No"
fi

甚至更简单

if (( first_value < second_value ));
then 
    echo "Yes"
else 
    echo "No"
fi

推荐阅读