シェルの論理演算子 && と 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

入門bash 第3版