10

空の要素を持つ配列をコピーする 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

元の配列には、空の要素を含む 3 つの要素がすべて含まれていますが、コピーには含まれていません。ここで何が間違っていますか?

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 に答える