パラメータ拡張を介して(つまり、printfを使用せずに)各配列要素を追加(変更)しますか?

パラメータ拡張を介して(つまり、printfを使用せずに)各配列要素を追加(変更)しますか?

以下のスクリプトで私のジレンマを説明します。

#!/bin/zsh

STUFF=( moose-hoof ovary clydsedale )

echo ${MINE=$(printf "MY-%s " $STUFF)}
echo ${MINE_EXP=${STUFF/^/MY-}}

MY-ムース蹄MY-卵巣MY-clydsedale

ムースの蹄の家のclydsedale

配列内のすべての要素への文字列連結を許可する正しい拡張フラグは何ですか?

答え1

使用$^array

配列を配列の中かっこ拡張に変換します。いつになるかはa=(foo bar baz)少し$^aそうです{foo,bar,baz}

$ a=(foo bar baz)
$ echo prefix${^a}suffix
prefixfoosuffix prefixbarsuffix prefixbazsuffix

~のため再利用ソート:

$ a=(1 2 3) b=(a b c)
$ echo $^a$^b
1a 1b 1c 2a 2b 2c 3a 3b 3c

もちろん、プレフィックスまたはサフィックスにシェル特殊文字(;コマンドを区切ったり、単語を区切るスペースなど$"'&*[?~)が含まれている場合は、それらを囲む必要があります。

echo 'p r e f i x '$^a' s u f f i x'

csh's(およびbash、ksh、zsh)と同じ:

echo 'p r e f i x '{foo,bar,baz}' s u f f i x'

$^aそれ自体は引用しないでください。"foo${^a}bar"次に展開されます。一つ言葉。参照したい状況の1つは、$^arrayforと同様に空の要素を維持したい場合です。次に、配列拡張を引用し、フラグまたは構文を使用する必要が$arrayあります(Bourneシェルのような)。(@)"${array[@]}""$@"

$ array=(x '')
$ printf '<%s>\n' $array         # empties removed
<x>
$ printf '<%s>\n' "$array"       # array elts joined with spaces
<x >
$ printf '<%s>\n' "${(@)array}"  # empties preserved
<x>
<>
$ printf '<%s>\n' "$array[@]"    # empties preserved
<x>
<>
$ printf '<%s>\n' $^array$^array # empty removed
<xx>
<x>
<x>
$ printf '<%s>\n' "$^array$^array" # concatenation of joined arrays
<x x >
$ printf '<%s>\n' "$^array[@]$^array[@]" # multiplexing with empties preserved
<xx>
<x>
<x>
<>

答え2

これはかなり古いスレッドですが、同じことをするために最近見つけたものを追加したいと思いました。パラメータ拡張変える:

${name/pattern/repl}

...

パターンは「#」で始まります(この場合、パターンは文字列の先頭で一致する必要があります)。または "%"(この場合、文字列の末尾で一致する必要があります)または '#%' の場合、パターンは文字列全体と一致する必要があります。 replは空の文字列にすることができます。この場合、最後の "/"も省略できます。それ以外の場合は、引用する最後の「/」の前にバックスラッシュを付ける必要があります。 "/"が代替パラメータ内に表示される場合、バックスラッシュは必要ありません。また、置換パラメータ内に「#」、「%」、および「#%」が表示されても最初はアクティブになりません。

#これにより、文字列の先頭/末尾でパターンを一致させることができ、パターンのみを使用することに制限はなく、%プレフィックスとサフィックスの配列で使用できます。

$ array=(foo bar baz)
$ echo ${array/#/prefix_}
prefix_foo prefix_bar prefix_baz
$ echo ${array/%/_suffix}
foo_suffix bar_suffix baz_suffix

文字列を操作しやすくなるため、それほど便利ではありませんが、それでも可能です。

$ string="bar"
$ echo ${string/#/foo_}
foo_bar
$ echo ${string/%/_baz}
bar_baz

関連情報