web-dev-qa-db-ja.com

配列をコマンドの引数に変換しますか?

コマンドの「オプション」の配列があります。

_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
46
manatwork

私はそれが配列にあることを処理せず、空白で区切られた文字列であると考えていました。このソリューションはそれで動作しますが、それが配列であることを前提として、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"
_
2
Kevin
[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'
0
user14039