シェルスクリプトの条件評価ではまりやすいところ

ちゃんと書いているつもりなのに、「unary operator expected」とか「test: too many arguments」 のようなエラーが出る。

・条件式に変数を使っていて、その変数がNullだとこのようなことが起きる。
つまり、

while [ $hoge -ne 10 ]

みたいな式で、$hogeがnullだと、

-ne 10

が評価され、unary operator expected となる。
また、

while [ 11 -ne 10 -a $fuga -eq 9 ]

で$fugaがNullだと、

11 -ne 10 -a -eq 9

として評価され、too many arguments
となる。


変数は初期化する。
もしくは、文字列で、Null、もしくは、"" が入る可能性があるのなら、変数を""で括る。

[ "$hoge" = "test" ]

hogeが初期化されていない場合でも、""として評価され、エラーにはならない。
逆に、

[ $hoge = "test" ]

の場合、たとえ hoge に "" を代入していても、unary operator expected となる。

追記

[[ $hoge = "test" ]]

とすれば、$hoge を""で囲わなくてもエラーになることはない。
if 文と test コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス