回答の古いバージョンについては、この回答の2番目の部分を参照してください。詳細について知りたい場合は、
問題の原因
質問自体では、OPがを見ることが報告too many arguments error
されbash
ていますが、テストではそうではないようです:
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
では/bin/sh
これが実際にシンボリックリンクされている/bin/dash
Ubuntuの上で、以下のように、エラーが報告されました:
$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator
また、スタンドアロン/bin/test
も:
$ /usr/bin/test $1 != ''
/usr/bin/test: missing argument after ‘’
追記:あなたが何であるかを迷っているならば/usr/bin/test
、なぜ私が使用しているbash
とsh
、あなたはそれが知っておくべき、[
の別名でtest
も、スタンドアロンの実行可能ファイルまたはより一般的として存在するコマンド、 -シェルとして内蔵された各シェルが最初に使用するものです。if
文、彼らはなぜ、したがって、コマンドの終了の彫像の上で動作[
し、test
他のすべてがそのコマンドへの引数であることで、コマンドで-エラーにこれらのコマンドライン引数のリード線の不適切な順序。
トピックに戻ります:OPが無関係のエラーを取得した方法は不明です。ただし、3つの場合すべてで問題は同じです。設定されていない変数は空として扱われるため、シェルはこれらの引用されていない変数で表示されます
[ != '' ]
これはtest
理解する構文を破ります。コマンドライン引数の不適切な順序について私が言ったことを覚えていますか?したがって、引用が重要である理由。診断出力を有効にして、シェルが実行するものを見てみましょう。
$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ]
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars
設定されていない変数をテストするより良い方法
よく見かけるアプローチは次のとおりです。
if [ "x$var1" == "x" ] && [ "x$var2" == "x" ];
then
echo "both variables are null"
fi
ジルを引用するには:
["x $ 1" = "x"]では、xプレフィックスによりx "$ 1"が演算子のように見えないことが保証されるため、シェルがこのテストを解析できる唯一の方法は=を二項演算子として扱うことです。
おそらく、/bin/sh
スクリプトでこれらを見てきたので、これはかなり移植性があるはずです。以下のように組み合わせることもできます
if [ "x${var1}${var2}" == "x" ]; then
...
fi
もちろん-z
、フラグを使用することもできますが、一部のシェル、特にksh88(Stephane Chazelasによる)の調査によると、このフラグは故障しています。
こちらもご覧ください