>=予想される単項演算子または予想される-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の値以上です。

浮動小数点比較はバージョン番号では機能しません。その理由は、部分がすべて整数であるためです(必ずしも2つである必要はありません)。例:

12.3 is earlier than 12.10
12.3.11 is later that 12.3.8

答え2

では文字列[比較のみサポートされていません。数値比較では使用できますが、整数ではないため、数値演算子では機能しません。>>=-ge12.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: 単項演算子が予想される"です。

このようなことが起こる[理由は一般コマンドしたがって、>リダイレクト演算子の一般的な方法で動作します。それ以降の単語は=ファイル名として扱われ、コマンドに渡される前に削除されます[。したがって、実際に存在する場合は、ファイル名がもはや順番が複雑であることだけが[ 12.2.1 >= 12.0 ]似ています。[ 12.2.1 12.0 ] > outputfile

[end の前に 2 つの引数が表示されるので、]単項演算子と対応するオペランドが必要です。たとえば、既存の一般ファイルであることを[ -f xyz ]確認してください。xyzもちろん、12.2.1有効な演算子ではないため、エラーが発生します。また、=スクリプトが実行されているディレクトリから呼び出されるファイルを見つけることもできます。

私も同じ結果で-eqを試しました。

さて、質問のタイトルで述べたように、エラーメッセージは「整数式が必要」なので、同じ結果ではありません。 Bashは整数演算のみを実行し、値は整数ではありません。解決策がありますBashまたは他の言語/フレームワークで整数および浮動小数点計算を実行するには?

しかし、、他の回答で述べたように、バージョン番号を10進数/浮動小数点数で比較することはできません。12.0数字ですが、12.2.1そうではありません。

関連情報