舊版 zsh 中的 zparseopts 與關聯數組

舊版 zsh 中的 zparseopts 與關聯數組

zparseopts我對兩個不同版本的 zsh的不同行為感到困惑。基本上,我試圖在關聯數組中設定預設選項值列表,並使用命令列上指定的任何選項覆寫這些預設值。下面的程式碼在 zsh 5.0.6 上運作良好,但在 4.3.6 上表現得很奇怪——具體來說,在 zsh 4.3.6 中,如果覆蓋單個鍵,我的整個預設值數組都會被覆蓋。

腳本

typeset -A opts
opts=(
--opt1 a
--opt2 b
)

zparseopts -A opts -K -- -opt1: -opt2:
echo ${(k)opts}

運行腳本

$ myscript 
--opt1 --opt2  # both zsh 4.3.6 and 5.0.6

$ myscript --opt1 x
--opt1 --opt2  # zsh 5.0.6; element of array is replaced
--opt1         # zsh 4.3.6; adding an element overwrites the whole array, no more opt2

這種行為令人困惑,因為 4.3.6 和 5.0.6 具有相同的選項-K條目zparseopts

-K 使用此選項,當不使用任何規範時,使用 -a 和 -A 選項以及 `=array' 形式指定的陣列將保持不變。這允許在呼叫 zparseopts 之前為它們分配預設值。

答案1

將腳本的最後一行替換為echo ${(kv)opts}.使用 4.3.6 和 5.0.6 運行應該顯示 4.3.6 解釋-K為重置opts,如果任何給出了選項,而僅在使用時5.0.6重置(保留或任何其他條目)。opts[--opt1]--opt1--opt2

(請注意,這似乎在 5.0.2 和 5.0.6 之間的某個時間發生了變化;您可能需要在 zsh-workers 郵件列表上詢問以確認。)=

相關內容