2012-09-07 12 views
26

diese Frage ist nicht das gleiche wie Does the shell support sets?unterstützt Linux Shell Listenstruktur?

Ich kenne viele Skriptsprache Unterstützung Listenstruktur, wie Python, Python, Ruby und JavaScript aktivieren, so was ist Linux-Shell?

unterstützt Shell eine solche Syntax?

for i in list: 
do 
    print i 
done 

ich würde zuerst initialisieren eine Liste, zum Beispiel:

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

dann über sie iterieren

ist das möglich, wenn Shell-Skripte programmieren?

+1

Beachten Sie auch, dass Bourne Shell/POSIX-Shell keine Arrays hat. Aber das 'für den Artikel in der Liste der Artikel; do' construct wird sicherlich in allen Shells unterstützt. Beachten Sie auch die praktische Verwendung von Globbing, um eine Reihe von Dateien zu durchlaufen. 'for file in a * .dat' erstellt eine Liste von Token, indem der Platzhalter erweitert wird (obwohl leider viele Benutzer es schaffen, es zu zerstören, indem sie etwas wie' for file in $ (ls a * .dat) ') machen. – tripleee

Antwort

45

Es unterstützt Listen, aber nicht als separate Datenstruktur (Arrays für den Moment ignorieren).

Der for Schleife iteriert über eine Liste (im allgemeinen Sinne) von Leerraumwerten getrennt ist, unabhängig davon, wie diese Liste erstellt wird, ob wörtlich:

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

oder über Erweiterungsparameter:

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

oder Befehls Substitution:

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

Ein arra y ist nur ein spezieller Parameter, der eine strukturierte Liste von Werten enthalten kann, wobei jedes Element selbst Leerzeichen enthalten kann. Vergleichen Sie den Unterschied:

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

Was bedeutet @? –

+2

Es ist ein spezieller Index, der bewirkt, dass die Erweiterung alle Elemente des Arrays erzeugt, nicht nur ein bestimmtes Element. – chepner

+0

Ich habe nicht bekommen, warum 'für i in $ {array [@]}"; "druckt 3 Zeilen. Da 'echo $ {array [@]}' eine einzelne Zeile "item 1 item 2 item 3" ausgibt, würde ich erwarten, dass 'für i in" $ {array [@]} ";' in 'for i in konvertiert wird "Punkt 1 Punkt 2 Punkt 3"; '; Es würde also zu einer einzelnen Zeile "Element 1 Element 2 Element 3" führen.Was vermisse ich? Vielen Dank im Voraus – Svech87

7

Für eine Liste machen, einfach zu tun, dass

colors=(red orange white "light gray") 

Technisch ein Array ist, aber - natürlich - es alle Listenfunktionen hat.
Sogar Python-Liste sind mit Array implementiert

+1

Um über das Array zu iterieren, verwenden Sie 'für Element in $ {colors [*]}; echo $ item; done' – neevek

+8

@Neevek das wird nicht tun, was Sie denken, dass es tut; "hellgrau" wird als zwei Elemente "hell" und "grau" behandelt. Sie müssen '" $ {colors [@]} "' ('@' not '*', und zitiert) verwenden. – chepner

+0

Warum wird "hellgrau" als zwei Elemente behandelt, wenn * verwendet wird? Wo finde ich Dokumente für solche Details? Mann sch? – hugemeow

Verwandte Themen