条件演算子: 宣言されていない変数が指定されている場合は単項演算子が必要です

条件演算子: 宣言されていない変数が指定されている場合は単項演算子が必要です

以下のスクリプトを実行していますが、単項演算子の問題でエラーが発生します。メインのシェル スクリプト プログラムでは、この existing_sum_check 変数を後ほど使用しますが、とにかくこのチェックを実行したいです。このエラーを回避するにはどうすればよいですか?

プログラム:

#!/bin/sh

latest_sum_check=10101;

if [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then
    EXISTING_SUM_CHECK = $latest_sum_check;

    echo $EXISTING_SUM_CHECK;
    echo "Please process";
else
    echo "Do not process"
fi

答え1

本質的には です[ something != $bar ]

が空の場合$bar、 は になりますがif [ something != ]、もちろんこれは機能しません。なぜなら、等価性テストには 2 つのオペランドが必要なためです。ただし、少なくとも Bash のtest/ は、[それを記述する面白い方法を持っています。どうやら、引数の数をチェックし、引数が 2 つしかないため、最初の引数が単項演算子であると想定します。something引数がないため、エラーが発生します。

変数を引用符で囲みます:

if [ "$latest_sum_check" != "$EXISTING_SUM_CHECK" ]; then ...

EXISTING_SUM_CHECKそして、これは等号と変数の展開から得られるものをパラメータとして含むコマンドを実行します。

 EXISTING_SUM_CHECK = $latest_sum_check;

シェル内の変数の割り当てでは、変数の周囲にスペースは必要ありません。

答え2

これは、宣言されていない変数 $EXISTING_SUM_CHECK があるために発生するテストのエラー状態です。次のような別のチェックが必要です。

if [ -z $EXISTING_SUM_CHECK ]; then
    EXISTING_SUM_CHECK=$latest_sum_check
elif [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then

これは、単項演算を使用して、文字列の長さが 0 かどうかを確認します。!= では、テストの両側に空でない値が必要です。

これを解決する別の方法は次のとおりです。

if [ "X${latest_sum_check}" != "X${EXISTING_SUM_CHECK}" ]; then

変数が設定されていないか、null または '' の場合、両方の値が少なくとも X になるように強制します。

また、通常、2 つの数値を比較する場合は、!= は文字列用に予約されているため、-ne の方が != よりも推奨されます。ただし、-ne は数字 [0-9] にのみ機能し、md5sum 結果などの 16 進数の比較には機能しません。

関連情報