我在使用空元素复制数组的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
原始数组包含所有三个元素,包括空元素,但副本不包含空元素。我在这里做错了什么?
答案 0 :(得分:17)
您有引用问题,而您应该使用@
,而不是*
。使用:
copy=( "${array[@]}" )
可以使用
${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