[解決済み】if [](角括弧)の「[: 引数が多すぎる」エラーの意味)
質問
以下の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
)
関連
-
[解決済み】if [](角括弧)の「[: 引数が多すぎる」エラーの意味)
-
[解決済み】ログアウトと再ログインをせずに.bashrcの設定を再読み込みする方法?
-
[解決済み] Bashで$()と`の違いはあるのでしょうか?重複] [重複
-
[解決済み] curl: 引数リストが長すぎる
-
[解決済み] 絶対パスと論理パスの違い
-
[解決済み] bashの"-ne "はどういう意味ですか?
-
[解決済み】Bashでは一重の角括弧[ ]よりも二重の角括弧[[ ]]の方が好ましいですか?
-
[解決済み】「if」文が多すぎる?
-
[解決済み】Bashの一重角括弧と二重角括弧の違いについて
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】firebase-tools "-bash: firebase: command not found".
-
[解決済み] シェルスクリプトでブール変数を宣言して使用するにはどうすればよいですか?
-
[解決済み] bashスクリプトでタブ文字をエコーする
-
[解決済み] find -exec cp {} でエラー 'find: missing argument to -exec' が発生した場合の解決策。TARGET_DIR + [閉店]。
-
[解決済み] Bashで文字列から改行を削除する方法
-
[解決済み] etc/profileでVISIBLE=NOWを設定するのはなぜですか?
-
[解決済み] cmake execute_process COMMAND [重複]。
-
[解決済み] 構文エラー:オペランドが期待される(エラーメッセージは "+")。
-
[解決済み] echoコマンドでパイピングが効かない [重複]。
-
[解決済み] cshスクリプトをbashでソースして環境を設定する方法 [終了しました]。