簡體   English   中英

如何將關聯數組分配給zsh中的另一個變量?

[英]How to assign an associative array to another variable in zsh?

在zsh中,有沒有辦法將關聯數組分配給另一個變量? 我想這樣的事情:

typeset -A orig
orig=(key1 val1 key2 val2)
typeset -A other
other=$orig
print '$orig:  '$orig
print '$other: '$other
print '$orig[key1]: '$orig[key1]
print '$other[key1]: '$other[key1]

這將打印:

$orig:  val1 val2
$other: val1 val2
$orig[key1]: val1
$other[key1]: 

我希望能夠使用$other[key1]並獲得val1

我知道我可以迭代按鍵並逐項復制,但我真的想避免這種情況。 另外, eval是邪惡的:)

我已經嘗試了other=($orig)和其他變體,但這將從orig獲取我的值並創建為這樣的關聯數組

other=(val1 val2)

所以other[key1]什么都不返回, other[val1]返回val2 ,這不是我想要的。

如果我理解正確的話,我的每次嘗試中發生的事情都是$other獲得$orig 的數組,沒有鍵。 如何讓它接收鍵值並在它們之間保持正確的關聯?

我不擔心空值,如果這甚至是一個問題,因為我相信$orig將表現得很好。

謝謝!

你必須深入研究參數擴展標志的精彩世界:) kv標志可以一起使用來強制關聯數組擴展到它的鍵和值。

$ typeset -A orig
$ orig=(key1 val1 key2 val2)
$ print ${(kv)orig}
key1 val1 key2 val2

然后,您可以使用set命令使用該擴展生成的交替鍵/值填充副本。

$ typeset -A other
$ set -A other ${(kv)orig}
$ print $other[key1]
val1

這些和其他標志記錄在man zshexpn “參數擴展標志”下,這是我最喜歡的zsh功能之一。

zsh: bad set of key/value pairs for associative array

沒有逃脫的完美世界:

typeset -A old new
old=(k1 v1 k2 v2 k3 v3)
typeset old    # old=( k1 v1 k2 v2 k3 v3 )

...不存在,您的數組通常包含空值:

old[k2]=
typeset old    # old=( k1 v1 k2 '' k3 v3 )

...因此你需要使用" (引用), @ (轉義)和f (場分離):

typeset new    # new=( )
new=("${(@fkv)old}")
typeset new    # new=( k1 v1 k2 '' k3 v3 )

有關參數擴展標志的更多信息,請參見man zshexpn

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM