配列をコマンドの引数に変換しますか?
コマンドの「オプション」の配列があります。
_my_array=(option1 option2 option3)
_
配列の値をオプションとして使用して、bashスクリプトでこのコマンドを呼び出します。したがって、command $(some magic here with my_array) "$1"
は次のようになります。
_command -option1 -option2 -option3 "$1"
_
どうすればできますか?出来ますか?
私は単純なbash
方法を好みます:
command "${my_array[@]/#/-}" "$1"
これの1つの理由はスペースです。たとえば、次の場合:
my_array=(option1 'option2 with space' option3)
sed
ベースのソリューションは-option1 -option2 -with -space -option3
(長さ5)に変換しますが、上記のbash
展開は-option1 -option2 with space -option3
(長さは3)に変換します。まれですが、これが重要になる場合もあります。たとえば、次のようになります。
bash-4.2$ my_array=('Ffoo bar' 'vOFS=fiz baz')
bash-4.2$ echo 'one foo bar two foo bar three foo bar four' | awk "${my_array[@]/#/-}" '{print$2,$3}'
two fiz baz three
私はそれが配列にあることを処理せず、空白で区切られた文字列であると考えていました。このソリューションはそれで動作しますが、それが配列であることを前提として、manatworkのソリューション(_@{my_array[@]/#/-}
_)を使用します。
これはsed
とサブシェルでそれほど悪くありません。正規表現がどれほど簡単かは、オプションについて何を保証できるかによって異なります。オプションがすべて1つの「Word」の場合(_a-zA-Z0-9
_のみ)、単純な開始Word境界(_\<
_)で十分です。
_command $(echo $my_array | sed 's/\</-/g') "$1"
_
オプションに他の文字(おそらく_-
_)がある場合は、もう少し複雑なものが必要になります。
_command $(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g') "$1"
_
_^
_は行の先頭に一致し、_[ \t]
_はスペースまたはタブに一致し、_\|
_はどちらかの側に一致します(_^
_または_[ \t]
_)、_\(
_ _\)
_はグループ化し(_\|
_の場合)、結果を格納します。_\<
_はWordの先頭に一致します。 _\1
_は、括弧(\(\)
)からの最初の一致を保持することによって置換を開始し、_-
_はもちろん必要なダッシュを追加します。
これらはgnu sedで動作しますが、gnu sedで動作しない場合はお知らせください。
また、同じものを複数回使用する場合は、一度計算して保存することもできます。
_opts="$(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g')"
...
command $opts "$1"
command $opts "$2"
_
[srikanth@myhost ~]$ sh sample.sh
-option1 -option2 -option3
[srikanth@myhost ~]$ cat sample.sh
#!/bin/bash
my_array=(option1 option2 option3)
echo ${my_array[@]} | sed 's/\</-/g'