理解bash *String*比较



我正在尝试比较版本号。例如,如果10.9小于10.11.

谁能解释一下为什么不打印"yes"?

 if [[ "9" < "10" ]]; then echo yes; fi

我需要做些什么才能使它正确地工作,因为9应该小于10?

此外,如果我在变量$VERSION中有"10.9",它将如何与"10.11"进行比较,因为这也无法打印'yes'

if [[ $VERSION < "10.11" ]]; then echo yes; fi

在本例中,这将返回正确的答案

if [[ "8" < "9" ]]; then echo yes; fi

但是对于你的特定情况,"10"小于"9",因为1小于9。字符串比较与数字比较的工作方式不同,因此顺序将类似于

1

10

20

21

3

您可以将字符串转换为数值,并使用-lt(小于)运算符来处理数值。Bash值是无类型的,所以,这将工作

if [ "9" -lt "10" ]; then echo yes; fi

可以在这里找到一些Bash参考

注意"10.9" lt不支持浮点数。您可以使用awk比较。

if [ -n "10.1" -a -n "10.2" ]; then echo yes; fi

由于<字符串比较运算符,因此"9"在字典顺序上大于"10"bash只能比较整数(使用-lt,在这种情况下[ "9" -lt "10 ]为真)。(注意bash没有单独的字符串和整数类型,只有字符串,这意味着"9"9是完全相同的字符串。决定行为的是操作符,而不是操作数)

bash根本不能处理浮点值。您需要使用外部命令(例如bcawk)来比较它们。当然,如果您的版本号可以包含超过1个小数点,那么您将需要使用其他方法,因为它们不再是浮点数。

最新更新