1. ホーム
  2. bash

[解決済み】if [](角括弧)の「[: 引数が多すぎる」エラーの意味)

2022-02-12 07:09:16

質問

以下のBASHのシェルエラーの意味と対処法を明記したシンプルでわかりやすい資料が見つからなかったので、調べた結果見つけたものを掲載します。

エラーの内容

-bash: [: too many arguments

Googleフレンドリー版。 bash open square bracket colon too many arguments .

コンテキストを表示します。 のような単純な比較演算子を持つ、一つの角括弧で囲まれた条件です。

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

解決方法は?

もし、あなたの $VARIABLE は、スペースやその他の特殊文字を含む文字列です。 と一重の角括弧が使用されます (のショートカットである)。 test コマンドを使用する場合)、文字列は複数の単語に分割されることがあります。この場合、それぞれは別の引数として扱われる。

そのため 一つの変数が多くの引数に分割される :

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 

単純な話ですが ただし、変数が空文字列や空白しか含まない文字列にならないことを保証できない場合は、以下の "Also beware..." まで読み飛ばしてください。


または 代替修正 は二重角括弧を使うことです(これは new test コマンドを使用します)。

ただし、これはbashにしか存在しないので(kornやzshにもあるらしい)、デフォルトのシェルで /bin/sh などがあります。

これは、一部のシステムで意味します。 のように、コンソールからは動作しても、他の場所から呼び出されると動作しないことがあります。 cron すべての設定によります。

こんな感じでしょうか。

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

このように、コマンドに二重角括弧が含まれていて、ログではエラーが出るがコンソールでは動作する場合、この部分を入れ替えてみてください。 [[ に変更するか、スクリプトを実行するシェルで [[ 別名 new test .


にも注意が必要です。 [: unary operator expected エラー

もし、"too many arguments" というエラーが表示されたら、予測不可能な出力を持つ関数から文字列を取得している可能性があります。 空文字列を取得することも可能な場合 (または空白文字ばかり) の場合、上記の "quick fix" でも引数がゼロとして扱われ、次のように失敗します。 [: 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 )