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の値の出力: 'second'

これらのステップは結果の次の行と一致します。

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

しかし、結果に次の行が表示されるのはなぜですか?

var1=var2
var2=var3

予想の代わりに:

var1=var3
var2=first

2番目の部分(下の----)の実行は(説明書に従って)次のようになります。

  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開発チームはこれを受け入れます。責任なし次の規則を読んでいる間に発生する可能性のある脳損傷について。

関連情報