Копирование массива Bash с пустыми элементами

у меня проблемы в bash (ver 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 ответов


у вас есть проблема с цитированием, и вы должны использовать @, а не *. Использовать:

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

С bash(1) man page:

любой элемент массива можно ссылаться с помощью ${name[subscript]}. Фигурные скобки необходимы, чтобы избежать конфликтов с расширением путь. Если subscript is @ или *, слово распространяется на всех членов name. Эти индексы различаются только тогда, когда слово появляется в двойных кавычках. Если это слово цитируется дважды,${name[*]} расширяется до одного слова с помощью значение каждого члена массива, разделенного первым символом IFS специальная переменная, и ${name[@]} расширяет каждый элемент name к отдельному слову.

пример вывода после изменения:

--- array (3) ---
one

three

--- copy (3) ---
one

three

начиная с Баш 4.3, вы можете сделать это

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

$ declare -n golf=alpha

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