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
但不是。