在 zsh 中加入扩展变量
Joining on expanded variables in 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 中是如何工作的...
不能在参数替换中使用数组声明。即使它确实有效,主要还是一种构建字符串“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}bar
⇒ fooabar foobbar foocbar
这样的扩展而不是 foo${list}bar
⇒ fooa 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}}
我正在尝试在没有中间变量的情况下执行以下操作:
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}}}
解释:
${:-a b c}
替换为 "a b c"。这样就可以像从参数替换中一样注入字符串。这可能看起来像是空操作,但下一步需要它。${=spec}
在计算spec
期间执行分词。这要求spec
是参数名称或参数替换。在这种情况下${=:-a b c}
被拆分为数组(a b c)
${^spec}
允许像foo${^list}bar
⇒fooabar foobbar foocbar
这样的扩展而不是foo${list}bar
⇒fooa 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}}