「$ {my_array [@] /#/-}」の/#/-はどのタイプの操作ですか?


17

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

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

私は、/#/-パーツが何をするのかを正確に把握しようとしています。残念ながら、私はそれを何と呼ぶべきかわからないので、ドキュメントを見つけるのに苦労しています。アレイといくつかのWebサイトに関するBashのマニュアルページセクションを調べましたが、何も見つかりません。

回答:


24

これは、パターン内の置換のインスタンスであるシェルパラメータ展開${parameter/pattern/replacement}膨張${parameter}の最初のインスタンス置き換え、patternとしますreplacement。この種のパターンのコンテキストでは、#特別です:パターンをパラメーターの先頭に固定します。このすべての最終結果は、my_array配列のすべての値を展開し、各値の前-に追加することです(各パラメーターの先頭にある空のパターンを置き換えることにより)。


2

はい、それはシェルパラメータ展開のパターン置換です:

${parameter/pattern/replacement}

しかし、最初の文字の後の最初の文字/が、/または#または(繰り返し)の%特別な意味を持つ場合allstartおよびend

で:

$ 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

#%はパターンの一部であり、同じパターンと//は異なる演算子で/あり、同じパターンを使用しているため、言葉遣いは少し誤解を招く可能性があります。pattern='#x'; echo "${var/$pattern}"(または${var//$pattern})は使用できますがpattern=/x; echo "${var/$pattern}"、とは異なりecho "${var//x}"ます。ことを注意#して%で組み合わせることができzshますが、ないbashksh
ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.