zsh中展开变量的连接

zsh中展开变量的连接,zsh,Zsh,我尝试在没有中间变量的情况下执行以下操作: list_a=(a b c) # build a list list_b=(1${^list_a}) # 1a 1b 1c joined=${(j:,:)list_b} # 1a,1b,1c 我希望像这样的工作 ${(j:,:)(1${^(a b c)})} 然后我意识到我的核心假设是错误的 1${^(a b c)} # this gives a bad substitution error 我很确定我根本不明白嵌套数组替换在

我尝试在没有中间变量的情况下执行以下操作:

list_a=(a b c)         # build a list
list_b=(1${^list_a})   # 1a 1b 1c
joined=${(j:,:)list_b} # 1a,1b,1c
我希望像这样的工作

${(j:,:)(1${^(a b c)})}
然后我意识到我的核心假设是错误的

1${^(a b c)} # this gives a bad substitution error

我很确定我根本不明白嵌套数组替换在zsh中是如何工作的

不能在参数替换中使用数组声明。即使它真的起作用了,构建字符串“1a,1b,1c”的方法也过于复杂

如果你真的因为某种原因需要这个,你可以选择

echo ${(j:,:):-1${^${=:-a b c}}}
说明:
  • ${:-abc}
    替换为“abc”。通过这种方式,可以像从参数子项中一样注入字符串。这似乎是一个空操作,但下一步需要它
  • ${=spec}
    在计算
    spec
    期间执行分词。这需要
    spec
    作为参数名称或参数替换。在这种情况下,
    ${=:-abc}
    被拆分为数组
    (abc)
  • ${^spec}
    允许像
    foo${^list}条这样的扩展⇒ 
    fooabar foobbar foocbar
    而不是
    foo${list}条
    ⇒ <代码>fooa b cbar
    。(带
    列表=(a b c)
  • ${(j:,:)数组}
    数组
    的元素与
    作为分隔符连接起来。这同样要求
    array
    作为参数名或参数扩展。由于上一个扩展与字符串
    1
    组合,因此需要插入
    ${:-word}
    替换

正如我最初所说,这只是一种复杂的表达“1a,1b,1c”的方式。在我看来,只有当数组已经在替换之外声明时,它才有意义。在这种情况下,您可以将
${=:-abc}
部分替换为数组参数的名称:

list=(a b c)
echo ${(j:,:):-1${^list}}