2012-09-07 32 views
26

to pytanie nie jest taka sama jak Does the shell support sets?czy struktura danych listy obsługiwanych przez linux shell?

Znam wiele języków skrypt Support List struktury, takie jak Python, Ruby, Python i JavaScript, więc co linux powłoki?

obsługuje taką składnię powłoki?

for i in list: 
do 
    print i 
done 

chciałbym pierwszy zainicjować listę, na przykład:

ListName = [ item1, item2, ..., itemn ] 

następnie iteracyjne nad nim

to możliwe przy programowaniu skryptów powłoki?

+1

Należy również zauważyć, że powłoka Bourne/POSIX nie ma tablic. Ale 'dla pozycji na liście przedmiotów; do 'construct jest z pewnością obsługiwany we wszystkich powłokach. Zwróć także uwagę na wygodne użycie globowania do zapętlenia zestawu plików; 'dla pliku w * .dat' tworzy listę tokenów poprzez rozwinięcie symbolu wieloznacznego (choć niestety wielu użytkownikom udało się go zniszczyć, robiąc coś takiego jak' dla pliku w $ (ls a * .dat) '). – tripleee

Odpowiedz

45

Obsługuje listy, ale nie jako osobną strukturę danych (ignorowanie tablic w danym momencie).

W for pętla iteruje listy (w sensie ogólnym) białej przestrzeni oddzielonych wartości, niezależnie od tego, w jaki sposób tworzona jest lista, czy dosł

for i in 1 2 3; do 
    echo "$i" 
done 

lub przez rozszerzenie parametrów:

listVar="1 2 3" 
for i in $listVar; do 
    echo "$i" 
done 
polecenie

lub substytucji:

for i in $(echo 1; echo 2; echo 3); do 
    echo "$i" 
done 

arra y jest tylko specjalnym parametrem, który może zawierać bardziej uporządkowaną listę wartości, gdzie każdy element może sam zawierać białe spacje. Porównaj różnicę:

array=("item 1" "item 2" "item 3") 
for i in "${array[@]}"; do # The quotes are necessary here 
    echo "$i" 
done 

list='"item 1" "item 2" "item 3"' 
for i in $list; do 
    echo $i 
done 
for i in "$list"; do 
    echo $i 
done 
for i in ${array[@]}; do 
    echo $i 
done 
+0

Co oznacza znak @? –

+2

Jest to specjalny indeks, który powoduje, że ekspansja generuje wszystkie elementy tablicy, a nie tylko jeden określony element. – chepner

+0

Nie zrozumiałem, dlaczego 'for i in" $ {array [@]} ";' wyświetla 3 wiersze. Ponieważ 'echo $ {array [@]}' wypisuje pojedynczą linię 'element 1 element 2 element 3 ', spodziewam się, że' for i in "$ {array [@]}"; 'jest konwertowane w' for i in "przedmiot 1 pozycja 2 pozycja 3"; '; tak by powstał pojedynczy wiersz "element 1 element 2 element 3".czego mi brakuje? Z góry dziękuję – Svech87

7

Aby zrobić listę, po prostu zrobić

colors=(red orange white "light gray") 

Technicznie jest tablicą, ale - oczywiście - ma wszystkie cechy listy.
Nawet lista pytonów jest zaimplementowana z tablicą

+1

Aby iterować po tablicy, użyj 'dla elementu w $ {colors [*]}; wykonaj echo $ item; done' – neevek

+8

@Nevek, który nie zrobi tego, co myślisz, że robi; "jasnoszary" będzie traktowany jako dwa elementy "jasny" i "szary". Musisz użyć '" $ {colors [@]} "' ('@' not '*' i zacytować). – chepner

+0

dlaczego "jasnoszary" będzie traktowany jako dwie rzeczy, gdy * zostanie użyte? gdzie mogę znaleźć dokumenty na takie szczegóły? człowiek sh? – hugemeow