コマンドの「オプション」の配列があります。
my_array=(option1 option2 option3)
配列の値をオプションとして使用して、bashスクリプトでこのコマンドを呼び出します。したがって、次のようにcommand $(some magic here with my_array) "$1"
なります。
command -option1 -option2 -option3 "$1"
どうすればいいですか?出来ますか?
コマンドの「オプション」の配列があります。
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
somevar=("${my_array[@]/#/-}")
値の周りの括弧に注意してください。)それから、使用するときはもちろん配列として扱い続ける必要があります:echo "${somevar[@]}"
。機能に関しては、言語の可能性によって制限されすぎています。array:を渡すことができsomefunc "${my_array[@]/#/-}"
ます。次に、内部に$@
:を配置しfunction somefunc() { echo "$@"; }
ます。ただし$@
、存在する場合は他のパラメーターも含まれ、変更された配列を返す方法はstdout以外にはありません。
@
配列の添字として使用しましたか?私はzsh 5.5.1でテストを行いましたが、唯一の違いは、zshがとして記述されたときに各アイテムの前に付けられるものに気づいただけ${my_array[@]/#/-}
でしたが、bashは*
下付き文字に対してもそれを行いました。
私はそれが配列にあることを処理せず、空白で区切られた文字列を考えていました。このソリューションはそれで動作しますが、それが配列である場合、manatworkのソリューション(@{my_array[@]/#/-}
)を使用します。
これはsed
サブシェルで悪くありません。正規表現がどれだけ簡単かは、オプションについて何を保証できるかにかかっています。オプションがすべて1つの「単語」(a-zA-Z0-9
のみ)である場合、単純な開始単語境界(\<
)で十分です。
command $(echo $my_array | sed 's/\</-/g') "$1"
オプションに他の文字(ほとんどの-
場合)がある場合、もう少し複雑なものが必要になります。
command $(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g') "$1"
^
行の先頭に[ \t]
一致し、スペースまたはタブに\|
一致し、どちらかの側(^
または[ \t]
)に一致し、\(
\)
グループ(の場合)\|
に\<
一致して結果を保存し、単語の先頭に一致します。 \1
かっこ(\(\)
)からの最初の一致を保持することで置換を開始し、-
もちろん必要なダッシュを追加します。
これらはgnu sedで動作しますが、あなたのものと動作しない場合はお知らせください。
また、同じものを複数回使用する場合は、一度計算して保存することもできます。
opts="$(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g')"
...
command $opts "$1"
command $opts "$2"
gsed
(使用してインストールしましたhomebrew
)。別のこと:の代わりにecho $my_array
、echo ${my_array[@]}
すべてのアイテムを取得するために行う必要がありましたmy_array
:echo $my_array
最初の要素のみを与えていました。しかし、答えと正規表現の説明、特に「単語の境界」についてのおかげで、これは非常に便利です。:)
[ $(echo x | sed 's/\</y/') == "yx" ] || exit
。
[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'
-
、各単語の先頭に追加したいmy_array
ですか?