単項演算子の問題に関するエラーが発生する以下のスクリプトを実行しています。デフォルトのシェルスクリプトでは、以下の既存の_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
これは、単項演算を使用して文字列の長さがゼロであることを確認します。 !=テストでは、両側にNULL以外の値が必要です。
この問題を解決する別の方法は次のとおりです。
if [ "X${latest_sum_check}" != "X${EXISTING_SUM_CHECK}" ]; then
変数が設定されていない場合、またはnullまたは""の場合、両方の値がX以上になるように強制します。
また、通常、2つの数字を比較するには、!=の代わりに-neを使用することをお勧めします。 != は文字列用に予約されているためです。ただし、-neは数値[0-9]でのみ機能し、md5sumの結果などの16進比較では機能しません。