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)