考虑以下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}
一样,这行得通吗?
答案 0 :(得分:2)
man zshexpn
提供了一个25(!)规则的列表,这些规则控制如何处理扩展。这里的问题是,${key1}_$key2
直到第23步才连接成一个单词,而(P)
的应用要早得多。您需要一个嵌套扩展来产生一个可以在其上应用(P)
的单词。为此,您可以使用:-
运算符,该运算符可以省略参数名称,而是扩展为您提供的任何默认值。
% print ${:-${key1}_$key2}
a_b
由于嵌套替换是流程的第1步,因此上述表达式可以填写第(P)
步在第4步中期望的名称。
% print ${(P)${:-${key1}_$key2}}
c