5

私はBASHで些細な問題になると思ったことを理解しようとしていますが、正しい構文を見つけるのに苦労しています。値の配列をループしたいのですが、そのうちの1つはアスタリスク(*)であり、プロセス中にワイルドカード展開が発生することは望ましくありません。

 WHITELIST_DOMAINS="* *.foo.com *.bar.com"
 for domain in $WHITELIST_DOMAINS
 do
    echo "$domain"
 done

私は上記を持っています、そして私は次の出力を得ようとしています:

 *
 *.foo.com
 *.bar.com

上記の代わりに、現在のディレクトリのディレクトリリストを取得し、その後に*.foo.comと*.bar.comが続きます。

どこかで逃げたり引用したりする必要があることはわかっています。早朝のもやはまだ私の脳に濃厚です。

これらの質問を確認しました:

bashの変数でワイルドカード展開をエスケープする方法は?

シェルワイルドカード文字の拡張を停止しますか?

4

2 に答える 2

6

問題は、配列が必要なのに、間にスペースがある要素を含む単一の文字列を記述したことです。代わりに配列を使用してください。

WHITELIST_DOMAINS=('*' '*.foo.com' '*.bar.com')

変数の置換(つまり"$foo")を常に二重引用符で囲みます。そうしないと、シェルが変数の値を個別の単語に分割し、各単語をファイル名のワイルドカードパターンとして扱います。同じことがコマンド置換にも当てはまります:"$(somecommand)"。配列変数の場合は、を使用"${array[@]}"して配列の要素のリストに展開します。

for domain in "${WHITELIST_DOMAINS[@]}"
 do
    echo "$domain"
 done

詳細については、アレイに関するbashFAQを参照してください。

于 2012-11-06T13:56:30.467 に答える
2

配列を使用してそれらを格納できます。

array=('*' '*.foo.com' '*.bar.com')

for i in "${array[@]}"
do
    echo "$i"
done
于 2012-11-06T13:48:51.460 に答える