以下のスクリプトを実行していますが、単項演算子の問題でエラーが発生します。メインのシェル スクリプト プログラムでは、この 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 進数の比較には機能しません。