2016-03-07 52 views
0

雖然看起來相當簡單,但顯而易見的解決方案有一點小細微差別。在zsh中複製1:1的數組

下面的代碼將覆蓋大多數情況下:

arr_1=(1 2 3 4) 
arr_2=($arr_1) 

然而,空字符串做拷貝過來。下面的代碼:

arr_1=('' '' 3 4) 
arr_2=($arr_1) 
print -l \ 
    "Array 1 size: $#arr_1" \ 
    "Array 2 size: $#arr_2" 

將產生:

Array 1 size: 4 
Array 2 size: 2 

我將如何去得到一個數組的真正副本?

回答

0

這將是一個「Array Subscripts」的問題,所以你可以適當地指定一個數組下標形式來選擇雙引號內的數組(arr_1 $例如)的所有元素:

arr_1=('' '' 3 4) 
arr_2=("${arr_1[@]}") 
#=> arr_2=("" "" "3" "4") 

$arr_1每個元素即使它是空的,也會被雙引號包圍。

形式'[*]'或'[@]'的下標評估爲數組的所有元素;兩者之間沒有區別,除非它們出現在雙引號內。 「$ foo [*]」'評估爲''$ foo 1 $ foo [2] ...「',而''$ foo [@]」'評估爲''$ foo 1「」$ foo [2]「...」。
...
當一個數組參數作爲 '$名稱'(沒有下標)其值爲 '$名稱[*]' 引用,

- Array Subscripts, zshparam(1)

和空元素的陣列將根據「Empty argument removal」被刪除,所以

arr_2=($arr_1) 
#=> arr_2=(${arr_1[*]}) 
#=> arr_2=(3 4) 

上述行爲是不是在這種情況下,好的。

24.空參數去除
如果取代不以雙引號出現,任何所得的零長度參數,無論是從一個標量或數組的一個元素,是從插入的參數列表消隱命令行。

- Empty argument removal, Rules Expansion zshexpn(1)