在zsh中复制数组1:1

时间:2016-03-07 07:33:07

标签: zsh

虽然看起来相当简单,但显而易见的解决方案有一点细微差别。

以下代码将涵盖大多数情况:

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

我如何获得数组的 true 副本?

1 个答案:

答案 0 :(得分:1)

这将是一个“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 {{3 “”$ foo [2]“......'   ...
  当数组参数被引用为'$ name'(没有下标)时,它的计算结果为'$ name [*]',

     

- 1

根据“Array Subscripts, zshparam(1)”删除数组的空元素,所以

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

在这种情况下,上述行为并不好。

  

24。空论证删除
  如果替换不出现在双引号中,则从插入命令行的参数列表中省略任何结果的零长度参数,无论是来自标量还是数组元素。

     

- Empty argument removal