
以下は、3 行目に引数が多すぎることを通知するスクリプトの一部です。
#!/bin/bash
export LC_ALL='C'
if [ `echo "*file 2" | grep -o ^.` = '.' ]
then
echo success
fi
理由を知っている人はいますか? 私の知る限りでは、単に「*」と「.」という 2 つの引数を比較しているだけです。
答え1
echo "*file 2" | grep -o ^.
プリント*
。
二重引用符の外側にコマンド置換があるため、グロビング (ワイルドカード マッチング、ファイル名生成とも呼ばれます) と単語分割が行われます。現在のディレクトリが空でない場合は、*
現在のディレクトリ内のファイルのリストに展開されます。各ファイルはコマンド内の 1 つのトークンになり[
、構文エラーになる可能性が高くなります。
問題は、コマンド置換を二重引用符で囲んでいないことです。変数とコマンドの置換には必ず二重引用符を使用してくださいただし、省略する正当な理由がある場合は除きます。
if [ "$(echo "*file 2" | grep -o ^.)" = '.' ]
見るシェル スクリプトが空白文字やその他の特殊文字で動作しなくなるのはなぜですか?より詳しい説明については。