以下のスクリプトで私のジレンマを説明します。
#!/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つは、$^array
forと同様に空の要素を維持したい場合です。次に、配列拡張を引用し、フラグまたは構文を使用する必要が$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>
<>