有人可以向我解释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/

10-13 04:55