2011-06-21 15 views
19

Mam tablicę w Bash, każdy element jest ciągiem. Jak mogę dodać kolejny ciąg do każdego elementu? W języku Java kod jest podobny do:Jak dołączyć łańcuch do każdego elementu tablicy Bash?

for (int i=0; i<array.length; i++) 
{ 
    array[i].append("content"); 
} 
+0

ciągi są niezmienne w Javie i nie ma metody append. 'nie może znaleźć symbolu symbol: symbol: metoda append (java.lang.String) lokalizacja: klasa java.lang.String \t \t tablica [i] .append (" treść "); uproszczona pętla for powinna powoli - po 5 lat - również zostanie przyjęty. 'for (String s: array) System.out.println (s +" content ");' –

Odpowiedz

13

Przetestowane i działa:

array=(a b c d e) 
cnt=${#array[@]} 
for ((i=0;i<cnt;i++)); do 
    array[i]="${array[i]}$i" 
    echo "${array[i]}" 
done 

produkuje:

a0 
b1 
c2 
d3 
e4 

EDIT: deklaracja array może być skrócony do

array=({a..e}) 

Aby pomóc w zrozumieniu tablic i ich składni w bashu, dobry początek to reference. Polecam również wyjaśnienie: bash-hackers.

+0

działa ... ale nieco mylące. możesz wyjaśnić, co znaczy "{}", jak w $ {tablica [i]}? dlaczego nie $ tablica [$ i]? – Richard

+3

@Richard: Niestety, składnia wymagana do pracy z tablicami Basha jest ... tajemna, delikatnie mówiąc; Nie wierzę, że można to wytłumaczyć jako "łatwiejsze" niż robi to strona man dla basha. (Co więcej, jest to dla mnie "znak odwieczny") – sehe

+0

'tablica [i] =" $ {tablica [i]} $ i "' może być uproszczona do: 'tablica [$ i] + =" $ i "' –

2

Przekazujesz długość tablicy jako indeks dla przypisania. Długość jest oparta na 1, a tablica jest indeksowana od 0, więc przekazując długość, mówisz bash, aby przypisać twoją wartość do gniazda po ostatnim w tablicy. Aby uzyskać długość tablicy, użyj tej składni ${array[@]}.

declare -a array 
array[${#array[@]}]=1 
array[${#array[@]}]=2 
array[${#array[@]}]=3 
array[${#array[@]}]=4 
array[${#array[@]}]=5 
echo ${array[@]} 

Produkuje

1 2 3 4 5 
+0

Dobra odpowiedź. niestety nie można wystarczająco żałować wymaganej składni (podatku od grzechu). – sehe

+0

Po prostu ponownie przeczytałem pytanie i uświadomiłem sobie, że odpowiedziałem na coś nieco innego. Zostawię tę odpowiedź tutaj, ponieważ zawiera ona jeszcze cenne informacje dotyczące tablic w bashu. –

+0

'tablica + = (1)'; 'tablica + = (2)'; ... 'tablica + = (etc)' –

66

Możesz dodać ciąg do każdego elementu tablicy, nawet bez pętli w Bashu!

# cf. http://codesnippets.joyent.com/posts/show/1826 
array=(a b c d e) 
array=("${array[@]/%/_content}") 
printf '%s\n' "${array[@]}" 
+0

Dobra! Nie jest to dokładna odpowiedź na to pytanie, ale jest niekwestionowanym zwycięzcą krótszej konkurencji! +1 – Rajish

+2

Link do Joyenta jest uszkodzony, patrz http://web.archive.org/web/20101114051536/http://codesnippets.joyent.com/posts/show/1826 zamiast (Wayback Machine dla tego linku). –

+1

Uwaga: to jest wewnętrznie zapętlone. –

52

Jak wspomniano przez Hal

array=("${array[@]/%/_content}") 

doda 'content' ciąg do każdego elementu.

array=("${array[@]/#/prefix_}") 

będzie poprzedzić ciąg „prefix_” do każdego elementu

+8

Dzięki. Właściwie szukałem ciągów znaków, więc twoje "#" jest dla mnie bardzo przydatne. – guaka

+0

Ten, zwięzły i na temat, powinien być zaakceptowaną odpowiedzią. Działa z dowolną [manipulacją ciągami] (http://tldp.org/LDP/abs/html/string-manipulation.html) i stosuje manipulację do każdego elementu tablicy. – starfry

Powiązane problemy