2016-07-26 5 views
2

スクリプトはカンマで区切られた引数のセリフをキャプチャしており、どのように動作するのか不思議です。サブシェルコールの中にcryptoptionsの後に3つのスラッシュがあるのはなぜですか?

for cryptopt in ${cryptoptions//,/ }; do 

この構文は何に対応していますか?

+0

は...ところで、(ここでは与えられたとして、 '$のbar'はコンマが空白に変異しているか否かの' $のbar'でfooの、)これは悪い習慣です、そしてバグに非常になりやすいです。独自のコードで使用しないでください。 –

+0

...あなたが現在のディレクトリにテキストファイルを持っている場合、特に '-name '* .txt''のような引数のペアを渡そうとするとどうなりますか?空白を含む単一の引数を渡そうとするとどうなるかを見てください。 –

+0

コンマで区切られたリストを扱う正しい方法は、 'IFS =、read -r -a opts <<<" $ cryptoptions "'のようになります。その配列は 'printf '%s \ n'" $ {opts [@]} "で一行ずつ出力された$ {opts [@]}" 'for xで反復処理できます。 、 './somecommandでコマンドラインに改正され、そのすべてのオプション "$ {optsの[@]}"'、などを持っている –

答えて

3

これは、それがすべてで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の各単語について、それはループ本体、dodone間のコードを実行します。

0

これを試してみてください。それが効果的に対応

cryptoptions=foo,bar,baz 
for cryptopt in ${cryptoptions//,/ }; do 
    echo $cryptopt 
done 

for cryptopt in $(echo "$cryptoptions" | sed 's/,/ /g'); do 
    echo $cryptopt 
done 

と引用符で囲まれていない変数は空白で分割することを利用しています。それはプロセスを生成しないので

旧さは、はるかに高速です。

+0

それは実際のベスト・プラクティスの選択肢を示す価値があるかもしれません。オプションが空白、グロブ文字などを含むことを可能にするもの –

関連する問題