在zsh中加入扩展变量

时间:2016-05-29 12:55:47

标签: 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

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

1 个答案:

答案 0 :(得分:2)

您不能在参数替换中使用数组声明。即使它确实有效,但构建字符串" 1a,1b,1c"主要是一种过于复杂的方式。

如果你出于某种原因确实需要这个,你可以选择

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

说明:

  • ${:-a b c}替换为" a b c"。通过这种方式,可以像参数替换一样注入字符串。这似乎是一个空操作,但下一步需要它。
  • ${=spec}在评估spec期间执行分词。这需要spec作为参数名称或参数替换。在这种情况下,${=:-a b c}会被拆分为数组(a b c)
  • ${^spec}允许foo${^list}barfooabar foobbar foocbar而不是foo${list}barfooa b cbar等扩展。 (使用list=(a b c)
  • ${(j:,:)array}array,的元素作为分隔符加入。这又需要array作为参数名称或参数扩展。由于先前的扩展与字符串1结合使用,因此需要插入${:-word}替换。

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

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