4

aこれらの 3 つの引数を含む、abcxyzなどの 3 つの引数を持つスクリプトを呼び出すとし$@ます。

write コマンドを呼び出したいとします。

command fooa fooabc fooxyz bara barabc barxyz

どうすればそれを達成できますか?

ブレース展開が展開される前に発生するため、考え{foo,bar}$@たり機能したりしません。{foo,bar}{$@}$@

4

1 に答える 1

9

以下を使用できます。

command "${@/#/foo}" "${@/#/bar}"

これは、シェル パラメーター展開の代替バリアントを使用します。は#、一致をパラメータの先頭に固定します。

$ set -- a abc xyz
$ echo command "${@/#/foo}" "${@/#/bar}"
command fooa fooabc fooxyz bara barabc barxyz
$

これを拡大{foo,bar,baz,...}$@または縮小する方法はあり{foo,bar}{123,456}$@ますか?

はい。ただし、配列を使用することになります。

$ set -- a abc xyz
$ args=( "$@" )
$ for prefix in foo bar baz who why; do prefixed1+=( "${args[@]/#/$prefix}" ); done
$ echo command "${prefixed1[@]}"
command fooa fooabc fooxyz bara barabc barxyz baza bazabc bazxyz whoa whoabc whoxyz whya whyabc whyxyz
$

または(シーケンスを正しく取得する必要があることに注意してください):

$ for prefix in 123 456; do prefixed1+=( "${args[@]/#/$prefix}" ); done
$ for prefix in foo bar; do prefixed2+=( "${prefixed1[@]/#/$prefix}" ); done
$ echo command "${prefixed2[@]}"
command foo123a foo123abc foo123xyz foo456a foo456abc foo456xyz bar123a bar123abc bar123xyz bar456a bar456abc bar456xyz
$

これにより、引数にスペースが保持されることに注意してください。

$ unset prefixed1 prefixed2
$ set -- 'a b' 'x y z'
$ args=( "$@" )
$ for prefix in 'p p-' '123 456 '; do prefixed1+=( "${args[@]/#/$prefix}" ); done
$ echo command "${prefixed1[@]}"
command p p-a b p p-x y z 123 456 a b 123 456 x y z
$ for prefix in 'foo 1-' 'bar 2-'; do prefixed2+=( "${prefixed1[@]/#/$prefix}" ); done
$ echo command "${prefixed2[@]}"
command foo 1-p p-a b foo 1-p p-x y z foo 1-123 456 a b foo 1-123 456 x y z bar 2-p p-a b bar 2-p p-x y z bar 2-123 456 a b bar 2-123 456 x y z
$ printf "[%s]\n" "${prefixed2[@]}"
[foo 1-p p-a b]
[foo 1-p p-x y z]
[foo 1-123 456 a b]
[foo 1-123 456 x y z]
[bar 2-p p-a b]
[bar 2-p p-x y z]
[bar 2-123 456 a b]
[bar 2-123 456 x y z]
$

最初のループは次のようになります。

for prefix in 'p p-' '123 456 '; do prefixed1+=( "${@/#/$prefix}" ); done

${args[@]}配列を使用せずに。

于 2016-03-17T22:45:09.887 に答える