有人可以向我解释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规则),第一部分(在------以上)的执行应为以下内容:
点7(应用:: =运算符)(将var1设置为var3)
点25(应用(P)运算符)(取消引用var1,获取var3)
输出var3的值:“ second”
这些步骤与结果中的以下行一致:
${${(P)var1::=var3}}=second
但是,为什么会出现以下行:
var1=var2
var2=var3
而不是预期的:
var1=var3
var2=first
第二部分(----下方)的执行应(根据手册):
点4(应用(P)运算符)(取消引用var1,获取var2)
点7(应用:: =运算符)(将var2设置为var3)
输出var2的值:'var3'
本节的结果与上面的解释完全吻合,因此问题仅在于第一节。
最佳答案
您跳过了规则1:嵌套替换。给定${${(P)var1::=var3}}=second
,规则1首先(递归)计算${(P)var1::=var3}
,首先应用规则4将其转换为${first::=var3}
。然后,您可以应用规则7来评估::=
运算符。完成此操作后,您将返回评估外部${...}
。
关于linux - zsh替换:(P)和:: =运算符的交互,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50683648/