zsh-如何引用以多个其他变量动态命名的变量?

时间:2018-07-28 10:54:36

标签: shell scripting zsh

考虑以下zsh脚本:

#! /bin/zsh

key1="a"
key2="b"

declare ${key1}_${key2}="c"

echo $a_b                       # this prints 'c' as expected
echo ${(P)${key1}_${key2}}      # Bad substitution

如您所见,我对最后一行的语法感到困惑。如何使用a_b$key1的内容引用变量$key2

此外,如果a_b是一个数组,如declare -a ${key1}_${key2}一样,这行得通吗?

1 个答案:

答案 0 :(得分:2)

man zshexpn提供了一个25(!)规则的列表,这些规则控制如何处理扩展。这里的问题是,${key1}_$key2直到第23步才连接成一个单词,而(P)的应用要早得多。您需要一个嵌套扩展来产生一个可以在其上应用(P)的单词。为此,您可以使用:-运算符,该运算符可以省略参数名称,而是扩展为您提供的任何默认值。

% print ${:-${key1}_$key2}
a_b    

由于嵌套替换是流程的第1步,因此上述表达式可以填写第(P)步在第4​​步中期望的名称。

% print ${(P)${:-${key1}_$key2}}
c