复制带有空元素的Bash数组

Ben*_*ber 9 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[*]}"
Run Code Online (Sandbox Code Playgroud)

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

--- array (3) ---
one

three

--- copy (2) ---
one
three
Run Code Online (Sandbox Code Playgroud)

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

Car*_*rum 17

你有一个引用问题,你应该使用@,而不是*.使用:

copy=( "${array[@]}" )
Run Code Online (Sandbox Code Playgroud)

bash(1)手册页:

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

更改后的示例输出:

--- array (3) ---
one

three

--- copy (3) ---
one

three
Run Code Online (Sandbox Code Playgroud)

  • 使用双引号和`@`,该单词扩展为"one""""three"`.没有它们,它会扩展到"一三". (3认同)