配列をコマンドの引数に変換するために受け入れられた答えは?次のBashコマンドを使用します。
command "${my_array[@]/#/-}" "$1"
私は、/#/-
パーツが何をするのかを正確に把握しようとしています。残念ながら、私はそれを何と呼ぶべきかわからないので、ドキュメントを見つけるのに苦労しています。アレイといくつかのWebサイトに関するBashのマニュアルページセクションを調べましたが、何も見つかりません。
配列をコマンドの引数に変換するために受け入れられた答えは?次のBashコマンドを使用します。
command "${my_array[@]/#/-}" "$1"
私は、/#/-
パーツが何をするのかを正確に把握しようとしています。残念ながら、私はそれを何と呼ぶべきかわからないので、ドキュメントを見つけるのに苦労しています。アレイといくつかのWebサイトに関するBashのマニュアルページセクションを調べましたが、何も見つかりません。
回答:
これは、パターン内の置換のインスタンスであるシェルパラメータ展開:${parameter/pattern/replacement}
膨張${parameter}
の最初のインスタンス置き換え、pattern
としますreplacement
。この種のパターンのコンテキストでは、#
特別です:パターンをパラメーターの先頭に固定します。このすべての最終結果は、my_array
配列のすべての値を展開し、各値の前-
に追加することです(各パラメーターの先頭にある空のパターンを置き換えることにより)。
はい、それはシェルパラメータ展開のパターン置換です:
${parameter/pattern/replacement}
しかし、最初の文字の後の最初の文字/
が、/
または#
または(繰り返し)の%
特別な意味を持つ場合all
、start
および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
ますが、ないbash
もksh
。