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

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

有人可以向我解释一下 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的值:'第二'

这些步骤与结果中的以下行一致:

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

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

var1=var2
var2=var3

而不是预期的:

var1=var3
var2=first

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

  1. 第 4 点(应用 (P) 运算符)(取消引用 var1,获取 var2)
  2. 第 7 点(应用 ::= 运算符)(将 var2 设置为 var3)
  3. 输出var2的值:'var3'

本节的结果与上面的解释完美匹配,因此问题仅在于第一部分。

答案1

(P)在分配之前应用,所以它是:

  1. ${(P)var1::=var3}->${var2::=var3}
  2. ->${var3}
  3. ->second

var3被分配到var2.

要强制执行其他顺序,请使用${${(P)${var1::=var3}}}

请注意手册中有关这些规则的注释:

请注意,Zsh 开发组接受没有责任对于在阅读以下规则期间可能发生的任何脑损伤。

相关内容