复制带有空元素的Bash数组

时间:2013-07-18 22:42:35

标签: arrays bash copy

我在使用空元素复制数组的bash(版本4.2.25)中遇到问题。当我将数组的副本复制到另一个变量时,它不会复制任何空元素。

#!/bin/bash

array=( 'one' '' 'three' )
copy=( ${array[*]} )

IFS=$'\n'

echo "--- array (${#array[*]}) ---"
echo "${array[*]}"

echo
echo "--- copy (${#copy[*]}) ---"
echo "${copy[*]}"

当我这样做时,这是输出:

--- array (3) ---
one

three

--- copy (2) ---
one
three

原始数组包含所有三个元素,包括空元素,但副本不包含空元素。我在这里做错了什么?

2 个答案:

答案 0 :(得分:17)

您有引用问题,而您应该使用@,而不是*。使用:

copy=( "${array[@]}" )

来自bash(1) man page

  

可以使用 ${name[subscript]} 引用数组的任何元素。          需要大括号以避免与路径名扩展冲突。如果           subscript @ * ,该字词扩展为 {的所有成员{1}} 即可。这些          只有当单词出现在双引号内时,下标才有所不同。如果          这个词是双引号, name 扩展为一个单词          每个数组成员的值由 ${name[*]} 的第一个字符分隔          特殊变量, IFS ${name[@]} 的每个元素扩展为单独的单词。

更改后的示例输出:

name

答案 1 :(得分:1)

Bash 4.3开始,您可以执行此操作

$ alpha=(bravo charlie 'delta  3' '' foxtrot)

$ declare -n golf=alpha

$ echo "${golf[2]}"
delta  3