zsh替换:(P)和:: =运算符交互

时间:2018-06-04 15:08:42

标签: linux shell unix scripting zsh

有人可以在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规则),第一部分(上面------)的执行应如下:

  1. 第7点(应用:: =运算符)(将var1设置为var3)
  2. 第25点(应用(P)运算符)(取消引用var1,得到var3)
  3. 输出var3的值:'second'
  4. 这些步骤与结果中的以下行一致:

    ${${(P)var1::=var3}}=second
    

    但为什么在结果中出现以下行:

    var1=var2
    var2=var3
    

    而不是预期的:

    var1=var3
    var2=first
    

    第二部分(下面----)的执行应该是(根据手册):

    1. 第4点(应用(P)运算符)(取消引用var1,得到var2)
    2. 第7点(应用:: =运算符)(将var2设置为var3)
    3. 输出var2的值:'var3'
    4. 本节的结果完全符合上述说明,因此问题仅出在第一部分。

1 个答案:

答案 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 ${...}.