>= 预期一元运算符或预期 -eq 整数表达式

>= 预期一元运算符或预期 -eq 整数表达式
monterey2="12.0"
macOS=$(sw_vers -productVersion)
if [ "$macOS" >= "$monterey2" ] ; then
  echo "Monterey"
else 
  echo "not Monterey"
fi
exit 0

输出此错误 - >“[:12.2.1:预期一元运算符”..我也尝试过 -eq ,结果相同。我究竟做错了什么?

答案1

将两个版本号回显sort -V并查看哪个版本号首先出现(作为文本)。如果它$monterey2作为文本匹配,则来自的值sw_vers大于或等于。

浮点比较不适用于版本号,因为各个部分都是整数(并且不一定只有其中两个)。例子:

12.3 is earlier than 12.10
12.3.11 is later that 12.3.8

答案2

在 下[,仅>支持字符串比较,不支持>=。对于数字比较,您可以使用-ge, 但12.2.1不是整数,因此它对数字运算符无效。

如果您只想检查 Monterey,请使用=(字符串相等):

if [ "$macOS" = "$monterey2" ] ; then

答案3

问题是test只能理解整数或字符串,但你想比较浮点数。我建议使用bc来获得比较结果。

特别是,改变这一点:

if [ "$macOS" >= "$monterey2" ] ; then

对此:

if [ $(echo "$macOS >= $monterey2" | bc) ]; then

编辑

这实际上在版本号有超过一位小数的情况下不起作用,例如12.2.1.

答案4

    if [ "$macOS" >= "$monterey2" ] ; then

输出此错误->“[:12.2.1:预期一元运算符”..我做错了什么?

发生这种情况[是因为正常命令,因此>以重定向运算符的通常方式工作。之后的单词 ,=被视为文件名,并且在传递给命令之前都被删除[。因此,如果您实际上有 eg [ 12.2.1 >= 12.0 ],它与 类似[ 12.2.1 12.0 ] > outputfile,只是文件名更奇怪,顺序更混乱。

[在结束之前看到两个参数],因此它需要一个一元运算符及其操作数。例如,[ -f xyz ]检查是否xyz是现有的常规文件。当然,12.2.1不是有效的运算符,因此您会收到错误。此外,您还会=在运行脚本的目录中找到调用的文件。

我也尝试过 -eq ,结果相同。

好吧,这不是相同的结果,因为错误消息是“需要整数表达式”,正如您在问题标题中提到的那样。 Bash 只进行整数运算,并且您的值不是整数。有解决方法如何在 bash 或其他语言/框架中进行整数和浮点计算?

然而,正如其他答案所提到的,无论如何,您都无法将版本号作为十进制/浮点数进行比较。虽然12.0是数字,12.2.1但不是。

相关内容