シェルスクリプトで数値が入った2つの変数を比較したいと思ってます。
しかし、片方の変数は空になる可能性も有ります。
ということで、当初下記のような条件文を書いていました。
value1=
value2=20110410
if [ -n "$value1" ] -a [ $value1 -lt $value2 ] ; then
echo ok
fi
しかし、value1を空にして動かすと、"[: too many argument" というエラーになります。
原因は and 演算子に当たる -a が短絡演算子(ショートサーキット)でなかったことでした。
つまり、最初の空文字かどうかのチェックで false になっても、後半の数値比較の構文が動いてしまうわけですね。
このような場合は、短絡演算子を使う必要がありますが、シェルスクリプトの場合、 && , || でOKのようです。
value1=
value2=20110410
if [ -n "$value1" ] && [ $value1 -lt $value2 ] ; then
echo ok
fi
[]は、if文の条件でよく使われる test 構文を省略したやつのようです。
[ の直後と、 ] の直前にスペースがいるのに要注意です。
また、空文字じゃないかどうか調べる際に、「-n 変数」という書式になるわけですが、変数をダブルクォーテーションでくくらないといけません。
-z (空文字かどうか)調べるときも同じです。
このあたりの話は、シェルスクリプトで空文字列かどうか調べる。 - masa.edw the ハバネロブリーダーで分かりやすくまとめられてました。
久しぶりにシェルスクリプト触ったんですが、基本的なことすっかり忘れた3流PGでした。
参考: