258

次の BASH シェル エラーの意味と修正方法を詳しく説明している単純でわかりやすいリソースが 1 つも見つからなかったので、調査して見つけたものを投稿します。

エラー:

-bash: [: too many arguments

Google フレンドリー バージョン: bash open square bracket colon too many arguments .

コンテキスト:単一の角括弧で囲まれた if 条件と、equals、greater than などの単純な比較演算子。次に例を示します。

VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
  # some action
fi 
4

6 に答える 6

423

your$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などによって呼び出されるデフォルトのシェルと互換性がない場合があります.

これは、一部のシステムでは、すべての構成方法に応じて、コンソールからは機能するが、 from などの他の場所で呼び出された場合は機能しない可能性があることを意味します。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 argumentstest: unary operator expected

于 2012-12-08T19:46:25.290 に答える