3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(Linux)シェルスクリプトの論理短絡演算子

シェルスクリプトで数値が入った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でした。

参考:

シェルスクリプト :: 条件分岐 if

if 文と test コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス