【问题标题】:Comparing two versions比较两个版本
【发布时间】:2022-11-11 15:40:58
【问题描述】:

我对此感到最艰难,想知道是否有人可以提供帮助。我正在尝试比较两个版本并在版本旧时输出一些东西。这是我所拥有的一个例子。

monterey="17612.4.9.1.8"
version=$(defaults read /Applications/Safari.app/Contents/Info.plist CFBundleVersion)
if [ "$version" -ge "$monterey" ] ; then
  echo "Up to date"
else 
  echo "Needs update"
fi
exit 0

我想做的是将Safari“版本”版本与“monterey”版本进行比较。如果 Safari 大于或等于“Monterey”,则回显“Up to date”。

但是每次我尝试这样做时,我都会得到“预期的整数表达式”,或者如果我尝试 >= 我会得到“预期的一元运算符”。

这个应该怎么写?

【问题讨论】:

  • 考虑更新问题以向我们展示version 变量中的内容,并解释您认为预期的输出应该是什么;版本字符串比较通常需要比较每个元组或简单地将 2 个版本字符串提供给 sort -V,然后您可以将第一(或第二)行与您希望看到的内容进行比较,让您知道哪个字符串“更大”;例如,printf "%s\n" "${monterey}" "${version}" | sort -V
  • @markp-fuso 不错!我不知道-V 排序选项。今天学习了,谢谢。

标签: bash macos safari macos-monterey


【解决方案1】:

17612.4.9.1.8 不能被视为整数。甚至不是一个数字:太多的点。如果要比较以点分隔的版本,则必须从主要版本号开始一次执行此字段。

一种选择是将字段存储在数组中:

$ m=(${monterey//./ })
$ echo ${m[0]}
17612
$ echo ${#m[@]}
5

m=(${monterey//./ }) 用空格替换$monterey 中的所有点并将结果存储在数组m 中,每个单元格一个空格分隔的单词。 ${#m[@]} 扩展为数组的大小。所以,像下面这样的东西应该做你想做的事:

m=(${monterey//./ })
v=(${version//./ })
(( n = ${#v[@]} < ${#m[@]} ? ${#m[@]} : ${#v[@]} ))
for (( i=0; i < n; i++ )); do
  if (( ${v[i]:-0} < ${m[i]:-0} )); then
    echo "Needs update"
    break
  elif (( ${v[i]:-0} > ${m[i]:-0} )); then
    echo "Up to date"
    break
  fi
done
exit 0

(( n = ${#v[@]} &lt; ${#m[@]} ? ${#m[@]} : ${#v[@]} )) 将最大数组大小存储在变量 n 中。 ${v[i]:-0} 扩展为 v[i] 如果它被设置而不是空字符串,否则扩展为 0

但是如果你可以使用sort,而不是普通的bash,你也可以使用:

l=$(printf '%s
%s
' "$monterey" "$version" | sort -nt. | tail -n1)
if [[ $version = $l ]]; then
  echo "Up to date"
else 
  echo "Needs update"
fi
exit 0

第一个命令对两个版本进行数字排序(-n),使用.作为分隔符(-t.),只保留最后一个(tail -n1),即最大的,并将其存储在变量l中.请注意,如果您可以有尾随 0 字段,这将无法正常工作:1.2.0.0 将被视为大于 1.2.01.2

正如@markp-fuso 所提到的,如果您的sort 实用程序支持它(它是一个非POSIX 功能,例如,在GNU coreutils sort 中),您也可以使用它的-V 选项你想要什么:

l=$(printf '%s
%s
' "$monterey" "$version" | sort -V | tail -n1)

【讨论】:

    【解决方案2】:

    -ge 用于数值比较操作。

    这是判断字符串是否相等,应该使用[ "$version" = "$monterey" ]

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 2021-11-30
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多