2013-07-18 2 views
7

빈 요소가있는 배열을 복사하는 bash (ver 4.2.25)에서 문제가 있습니다. 배열의 복사본을 다른 변수에 복사하면 빈 요소가 복사되지 않습니다. 나는이 작업을 수행 할 때빈 요소가있는 Bash 배열 복사

#!/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 

원래의 배열이 빈 요소를 포함한 모든 세 가지 요소를 가지고 있지만 복사하지 않습니다. 여기서 내가 뭘 잘못하고 있니?

답변

15

인용문 문제가있어 이 아닌 @을 사용해야합니다. 사용

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

bash(1) man page에서 : 배열의

모든 요소는 ${name[subscript]} 사용하여 참조 할 수있다. 경로 이름 확장과의 충돌을 피하기 위해 중괄호가 필요합니다. subscript@ 또는 * 경우, 단어 name의 모든 멤버로 확장됩니다. 이 아래 첨자는 단어가 큰 따옴표 안에 나타날 때만 다릅니다. 경우 단어 ${name[*]}IFS 특별한 변수의 첫번째 문자에 의해 분리 된 각 배열 부재의 값으로 하나의 단어로 확장 이중 인용하고 ${name[@]}name의 각 요소를 확대 별도의 단어로 그 변경 후

예 출력 :

--- array (3) --- 
one 

three 

--- copy (3) --- 
one 

three 
+0

그냥 그것을 시도하지만 불행히도 아무것도 변경되지 할 수 있습니다. –

+0

나는 그것을 의심 스럽다 - 당신은'@'과 큰 따옴표를 모두 가지고 있습니까? 방금 예제 출력을 추가했습니다. –

+0

아, 큰 따옴표! 죄송합니다, 이중 따옴표를 보지 못했습니다. 그래, 그게 효과가있어. 그래서 나를 도와주세요. 따옴표로 왜이 일을합니까? –

1

Bash 4.3부터이

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

$ declare -n golf=alpha 

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