シェルの論理演算子 && と test コマンドの論理演算子 -a [linux]
よくシェルの条件式で使われる AND 論理演算子の && や -a.
実は動作が異なることを最近知りました。
例えば、以下。
if [ -n "$num" ] && [ "$num" -lt "$MAX" ]; then ...
$num が null ではなく、$MAX より小さい場合は ...を行うという条件文です。
$num が null の場合、-n の評価で偽となるため -lt は評価されません。
test コマンドの -a を使って以下のように書くと。。
if [ \( -n "$num" \) -a \( "$num" -lt "$MAX" \) ]; then ...
-lt の部分も評価されます。
-lt は 2 項演算子ですが、$num が null のためエラーとなってしまいます。
今回の意図通りに動作させるには && を使った方が正解。
ref.
- 入門bash 第3版 p.125