if [] (角括弧) の "[: 引数が多すぎます" エラーの意味 質問する

if [] (角括弧) の

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

エラー:

-bash: [: too many arguments

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

コンテキスト:等しい、より大きいなどの単純な比較演算子を含む単一の角括弧内の if 条件。例:

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

ベストアンサー1

$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/shetcによって呼び出されるデフォルトのシェルとは互換性がない可能性があります。

つまり、一部のシステムでは、すべての構成に応じて、コンソールからは機能するが、 などの他の場所から呼び出された場合は機能しない可能性があります。cron

次のようになります:

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

コマンドにこのように二重の角括弧が含まれていて、ログにエラーが表示されるがコンソールからは機能する場合は、 をここで提案されている代替手段に交換するか、スクリプトを実行するものがaka を[[サポートするシェルを使用していることを確認してください。[[new test


[: unary operator expectedエラーにも注意してください

「引数が多すぎます」というエラーが表示された場合は、関数から予期しない出力の文字列を取得している可能性があります。空の文字列(または空白のみの文字列)を取得する可能性もある場合は、上記の「クイックフィックス」を適用しても引数が0個として扱われ、次のエラーで失敗します。[: 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

おすすめ記事