2013-07-18 33 views
7

Mam problemy w bashu (wersja 4.2.25), kopiując tablice z pustymi elementami. Kiedy robię kopię tablicy w innej zmiennej, nie kopiuje ona żadnych pustych elementów wraz z nią.Skopiuj tablicę Bash z pustymi elementami

#!/bin/bash 

array=('one' '' 'three') 
copy=(${array[*]}) 

IFS=$'\n' 

echo "--- array (${#array[*]}) ---" 
echo "${array[*]}" 

echo 
echo "--- copy (${#copy[*]}) ---" 
echo "${copy[*]}" 

Kiedy to zrobić, tutaj jest wyjście:

--- array (3) --- 
one 

three 

--- copy (2) --- 
one 
three 

Oryginalna tablica ma wszystkie trzy elementy w tym pustym elemencie, ale kopia nie. Co ja tu robię źle?

Odpowiedz

15

Masz problem z wyceną i powinieneś używać @, a nie *. Zastosowanie:

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

Z bash(1) man page:

Każdy element tablicy może się odwoływać przy użyciu ${name[subscript]}. Klamry są wymagane, aby uniknąć konfliktów związanych z rozszerzaniem nazw plików. Jeśli subscript jest @ lub * słowo rozwija się do wszystkich członków name. Te dolne pozycje różnią się tylko wtedy, gdy słowo pojawia się w podwójnym cudzysłowie. Jeśli słowo jest dwukrotnie cytowane ${name[*]} rozszerza się do pojedynczego słowa o wartości każdego elementu macierzy oddzielone pierwszym znakiem zmiennej specjalnej IFS i ${name[@]} rozszerza każdy element name na osobne słowo.

Przykâadowa po tej zmianie:

--- array (3) --- 
one 

three 

--- copy (3) --- 
one 

three 
+0

Właśnie próbowałem ale niestety nic się nie zmieniło. –

+0

Wątpię w to - czy masz zarówno "@", jak i podwójne cytaty? Właśnie dodałem przykładowy wynik. –

+0

Och, podwójne cytaty! Niestety, nie widzisz podwójnych cytatów. Tak, działało. Więc pomóż mi, dlaczego cytaty sprawiają, że to działa? –

1

Począwszy Bash 4.3, można to zrobić

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

$ declare -n golf=alpha 

$ echo "${golf[2]}" 
delta 3 
Powiązane problemy