通过参数扩展(即没有 printf)附加(更改)每个数组元素?

ale*_*ray 8 zsh array string brace-expansion variable-substitution

让下面的脚本举例说明我的困境..

#!/bin/zsh

STUFF=( moose-hoof ovary clydsedale )

echo ${MINE=$(printf "MY-%s " $STUFF)}
echo ${MINE_EXP=${STUFF/^/MY-}}
Run Code Online (Sandbox Code Playgroud)

MY-驼鹿蹄 MY-卵巢 MY-clydsedale

驼鹿蹄子卵巢克莱兹代尔

允许在数组的每个元素上进行字符串连接的正确扩展标志是什么?

Sté*_*las 17

使用$^array.

它将数组转换为数组的一种大括号扩展。至于在什么时候a=(foo bar baz)$^a会有点像{foo,bar,baz}

$ a=(foo bar baz)
$ echo prefix${^a}suffix
prefixfoosuffix prefixbarsuffix prefixbazsuffix
Run Code Online (Sandbox Code Playgroud)

对于多路复用数组:

$ a=(1 2 3) b=(a b c)
$ echo $^a$^b
1a 1b 1c 2a 2b 2c 3a 3b 3c
Run Code Online (Sandbox Code Playgroud)

自然地,如果前缀或后缀包含 shell 特殊字符(比如;分隔命令或分隔单词的空格,或$"'&*[?~...),它们必须被引用:

echo 'p r e f i x '$^a' s u f f i x'
Run Code Online (Sandbox Code Playgroud)

csh's(以及 bash、ksh、zsh 的)相同:

echo 'p r e f i x '{foo,bar,baz}' s u f f i x'
Run Code Online (Sandbox Code Playgroud)

$^a本身不能被引用,"foo${^a}bar"会扩展为一个词。您希望$^array被引用的一种情况,与 for 相同的$array是您希望保留空元素。然后,您需要引用数组扩展并使用(@)标志或"${array[@]}"语法(让人想起 Bourne shell 的"$@"):

$ 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>
<>
Run Code Online (Sandbox Code Playgroud)