bash为什么按字典顺序而不是数字来评估数字比较?

时间:2019-11-14 09:06:52

标签: bash if-statement syntax

有人可以解释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,...该块将返回“否”

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

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

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

操作系统为“ CentOS Linux版本7.5.1804(核心)”

2 个答案:

答案 0 :(得分:4)

此行为的原因是由于[[ "${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

答案 1 :(得分:1)

关于您的问题:首先,if块不返回任何内容。它只执行一组语句或另一组语句,在您的情况下,它们会向stdout写一些东西。

现在对您所观察到的行为进行解释。

[[ ... ]]表达式中的<运算符进行字典比较。例如

[[ 67 < 7 ]]

“ 67”在词汇上比“ 7”小,因此[[....]]返回状态代码0,这意味着if正在执行then部分,从而导致打印Yes。