Bash - 需要整数表达式

Bash - 需要整数表达式

我正在检查我的主题的更新脚本

我有 2 个文本文件。第一个称为“current.txt”并包含当前版本。4.1.1该文本文件中有字符串。

第二个称为“latest.txt”并包含最新版本。4.2该文本文件中有字符串。

所以这是代码

echo "Checking update";
x=$(cat ./current.txt)
y=$(cat ./latest.txt)
if [ "$x" -eq "$y" ]
then
       echo There is version $y update
else
       echo Version $x is the latest version
fi

这意味着如果 current.txt 与latest.txt 不同,那么它会显示“有版本 4.2 更新”。如果没有,它会说“版本4.1.1是最新版本”

但是当我尝试运行它时。我收到这个错误

Checking update
./test.sh: line 4: [: 4.1.1: integer expression expected
Version 4.1.1 is the latest version

那么我做错了什么?

答案1

test命令,也称为[,具有用于字符串比较和整数比较的单独运算符:

整数1 -eq 整数2

INTEGER1 等于 INTEGER2

字符串 1 = 字符串 2

字符串相等

字符串 1 != 字符串 2

字符串不相等

由于您的数据严格来说不是整数,因此您的测试需要使用字符串比较运算符。注释中的最后一个认识是“-eq”逻辑与 if/elseecho语句的含义不匹配,因此新的代码片段应该是:

...
if [ "$x" != "$y" ]
then
       echo There is version $y update
else
       echo Version $x is the latest version
fi

答案2

顺便说一句,如果您有两个版本字符串(例如 in$x$y),您可以使用printf和 GNUsort来查找哪个版本较新。

$ x=4.1.1
$ y=4.2.2
$ printf "%s\n" "$x" "$y" | sort -V -r
4.2.2
4.1.1

$ if [ $(printf "%s\n" "$x" "$y" | sort -V -r | head -1) = "$x" ] ; then
  if [ "$x" = "$y" ] ; then
    echo "$x is equal to $y"
  else
    echo "$x is newer than $y"
  fi
else
  echo "$x is older than $y"
fi
4.1.1 is older than 4.2.2

相关内容