"${my_array[@]/#/-}" の /#/- はどのような操作ですか?

"${my_array[@]/#/-}" の /#/- はどのような操作ですか?

受け入れられた回答配列をコマンド引数に変換しますか?次の Bash コマンドを使用します。

command "${my_array[@]/#/-}" "$1"

この部分が正確にどのような役割を果たしているのかを調べたいと思います/#/-。残念ながら、これを何と呼ぶべきかわからないので、文書を見つけるのに苦労しています。配列といくつかのウェブサイトのBashのマニュアルページのセクションを見ましたが、何も見つかりませんでした。

答え1

パターン置換の例です。シェルパラメータ拡張${parameter/pattern/replacement}拡張して${parameter}最初のインスタンスを 。このパターンの文脈では特別です。パターンを引数の先頭に固定します。これらすべての最終結果は、配列内のすべての値を拡張して各値の前に追加することです(各パラメータの先頭にある空のパターンを置き換えて)。patternreplacement#my_array-

答え2

はい、パターン交換ですシェルパラメータ拡張ように:

${parameter/pattern/replacement}

ただし、最初の文字の後の最初の文字がまたはの場合//繰り返し)合計という特別な意味を#持ちます。%allstartend

そして:

$ str='one_#two_two_three_one'

単一のインスタンスが/最初のインスタンスを置き換えます。最初の例one:

$ echo "${str/one/x-x}"
x-x_#two_two_three_one

または最初のインスタンスtwo

$ echo "${str/two/x-x}"
one_#x-x_two_three_one

one最終例:

$ echo "${str/%one/x-x}"
one_#two_two_three_x-x

すべての重複two

$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one

one始めの例:

$ echo "${str/#one/x-x}"
x-x_#two_two_three_one

#(引用符)で始まる文字列#

$ echo "${str/\#two/x-x}"
one_x-x_two_three_one

ただし、#のみ(引用符なし)のままにすると、変数の先頭に置換項目が設定されます。

$ echo "${str/#/====}"
====one_#two_two_three_one

また、引数が配列の場合、すべての要素が置き換えられます。

$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three

関連情報