あなたの場合は$VARIABLE
スペースやその他の特殊文字、文字列ですと、単一の角括弧を使用している(のショートカットであるtest
コマンド)、その文字列を複数の単語に出て分割することができます。これらはそれぞれ個別の引数として扱われます。
したがって、1つの変数が多くの引数に分割されます。
VARIABLE=$(/some/command);
# returns "hello world"
if [ $VARIABLE == 0 ]; then
# fails as if you wrote:
# if [ hello world == 0 ]
fi
スペースやその他の特殊文字を含む文字列を置く関数呼び出しについても同じことが言えます。
簡単な修正
変数の出力を二重引用符で囲み、強制的に1つの文字列(したがって1つの引数)のままにします。例えば、
VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
# some action
fi
そのような単純な。ただし、変数が空の文字列または空白のみを含む文字列でないことも保証できない場合は、以下の「注意してください...」に進んでください。
または、代わりの修正は、二重の角括弧(new test
コマンドのショートカット)を使用することです。
これはbash(そして明らかにkornとzsh)にのみ存在するため、/bin/sh
etc によって呼び出されるデフォルトのシェルと互換性がない場合があります。
これは、一部のシステムでは、すべての構成方法によっては、コンソールからは機能するが、のように他の場所から呼び出されたときに機能しない場合があることをcron
意味します。
次のようになります。
VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
# some action
fi
コマンドにこのような二重角かっこが含まれていて、ログでエラーが発生したがコンソールからは機能[[
する場合は、ここで提案されている代替案をに交換するか、スクリプトの実行内容が[[
aka をサポートするシェルを使用していることを確認してくださいnew test
。
[: unary operator expected
エラーにも注意してください
「引数が多すぎます」というエラーが表示された場合は、予測できない出力の関数から文字列を取得している可能性があります。空の文字列(またはすべての空白文字列)を取得することも可能な場合、これは上記の「クイックフィックス」を使用しても引数なしとして扱われ、失敗します。[: unary operator expected
他の言語に慣れている場合も同じです。変数が評価される前に、変数の内容がこのようなコードに効果的に出力されるとは期待していません。
[: too many arguments
と[: unary operator expected
エラーの両方を防ぐ例を次に示します。出力が空の場合(この例では0
)、デフォルト値で置き換え、全体を二重引用符で囲みます。
VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
# some action
fi
(ここでは、$ VARIABLEが0または空の場合にアクションが発生します。当然、異なる動作が必要な場合は、0(デフォルト値)を別のデフォルト値に変更する必要があります)
最後の注記:[
はのショートカットなのでtest
、上記のすべてはエラーにも当てはまりますtest: too many arguments
(またtest: unary operator expected
)