10

我在 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

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

4

2 回答 2

18

你有一个报价问题,你应该使用@,而不是*。利用:

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

bash(1)手册页

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

更改后的示例输出:

--- array (3) ---
one

three

--- copy (3) ---
one

three
于 2013-07-18T22:46:32.007 回答
2

Bash 4.3开始,您可以这样做

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

$ declare -n golf=alpha

$ echo "${golf[2]}"
delta  3
于 2015-04-25T23:34:15.450 回答