有人可以在zsh中向我解释以下脚本的结果:
#!/bin/zsh
var1=var2
var2=first
var3=second
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
echo '${${(P)var1::=var3}}'="${${(P)var1::=var3}}"
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
echo ------------
var1=var2
var2=first
var3=second
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
echo '${(P)var1::=var3}'="${(P)var1::=var3}"
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
结果:
var1=var2
var2=first
var3=second
${${(P)var1::=var3}}=second
var1=var2
var2=var3
var3=second
------------
var1=var2
var2=first
var3=second
${(P)var1::=var3}=var3
var1=var2
var2=var3
var3=second
据我了解zsh手册(14.3.2规则),第一部分(上面------)的执行应如下:
这些步骤与结果中的以下行一致:
${${(P)var1::=var3}}=second
但为什么在结果中出现以下行:
var1=var2
var2=var3
而不是预期的:
var1=var3
var2=first
第二部分(下面----)的执行应该是(根据手册):
本节的结果完全符合上述说明,因此问题仅出在第一部分。
答案 0 :(得分:0)
You skipped rule 1: nested substitution. Given ${${(P)var1::=var3}}=second
, rule 1 first (recursively) evaluates ${(P)var1::=var3}
, which starts by applying rule 4 to turn that into ${first::=var3}
. Then you can apply rule 7 to evaluate the ::=
operator. Once that is done, you go back to evaluating the outer ${...}
.