スクリプトはカンマで区切られた引数のセリフをキャプチャしており、どのように動作するのか不思議です。サブシェルコールの中にcryptoptionsの後に3つのスラッシュがあるのはなぜですか?
for cryptopt in ${cryptoptions//,/ }; do
この構文は何に対応していますか?
スクリプトはカンマで区切られた引数のセリフをキャプチャしており、どのように動作するのか不思議です。サブシェルコールの中にcryptoptionsの後に3つのスラッシュがあるのはなぜですか?
for cryptopt in ${cryptoptions//,/ }; do
この構文は何に対応していますか?
これは、それがすべてでSEDとは何の関係もありません 、「bashで変数の呼び出しのようにsedを」ではありません。 man bash
から
、パターン置換セクションで:
${cryptoptions/,/ }
:つまり
${parameter/pattern/string} Pattern substitution. The pattern is expanded to produce a pat- tern just as in pathname expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. If pattern begins with /, all matches of pattern are replaced with string. Normally only the first match is replaced.
${cryptoptions//,/ }
スペースで最初,
を置き換えます。置換すべて,
空白付きそして、これは周りにループがあります。 words
の各単語について、それはループ本体、do
とdone
間のコードを実行します。
これを試してみてください。それが効果的に対応
cryptoptions=foo,bar,baz
for cryptopt in ${cryptoptions//,/ }; do
echo $cryptopt
done
:
for cryptopt in $(echo "$cryptoptions" | sed 's/,/ /g'); do
echo $cryptopt
done
と引用符で囲まれていない変数は空白で分割することを利用しています。それはプロセスを生成しないので
旧さは、はるかに高速です。
それは実際のベスト・プラクティスの選択肢を示す価値があるかもしれません。オプションが空白、グロブ文字などを含むことを可能にするもの –
は...ところで、(ここでは与えられたとして、 '$のbar'はコンマが空白に変異しているか否かの' $のbar'でfooの、)これは悪い習慣です、そしてバグに非常になりやすいです。独自のコードで使用しないでください。 –
...あなたが現在のディレクトリにテキストファイルを持っている場合、特に '-name '* .txt''のような引数のペアを渡そうとするとどうなりますか?空白を含む単一の引数を渡そうとするとどうなるかを見てください。 –
コンマで区切られたリストを扱う正しい方法は、 'IFS =、read -r -a opts <<<" $ cryptoptions "'のようになります。その配列は 'printf '%s \ n'" $ {opts [@]} "で一行ずつ出力された$ {opts [@]}" 'for xで反復処理できます。 、 './somecommandでコマンドラインに改正され、そのすべてのオプション "$ {optsの[@]}"'、などを持っている –