web-dev-qa-db-ja.com

Bash-整数式が必要です

テーマの更新スクリプトのチェックを行っています

2つのテキストファイルがあります。最初のものは「current.txt」と呼ばれ、現在のバージョンが含まれています。有る 4.1.1そのテキストファイル内の文字列。

2つ目は「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

だから私はこれで何が間違っているのですか?

7
superquanganh

test コマンドは、[とも呼ばれ、文字列比較と整数比較用に別々の演算子があります。

INTEGER1 -eq INTEGER2

INTEGER1はINTEGER2と等しい

STRING1 = STRING2

文字列は等しい

そして

STRING1!= STRING2

文字列が等しくない

データは厳密には整数ではないため、テストでは文字列比較演算子を使用する必要があります。コメントの最後の認識は、 "-eq"ロジックがif/else echoステートメントの意味と一致しなかったため、新しいスニペットは次のようになります。

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

ところで、2つのバージョン文字列がある場合(例:$xおよび$yprintfおよびGNU sortを使用して、どちらが新しいかを見つけることができます。

$ 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
2
cas