2012-09-07 15 views
26

questa domanda non è lo stesso di Does the shell support sets?la struttura dati dell'elenco di supporto della shell linux?

Conosco un sacco di supporto linguaggio di script struttura della lista, come Python, Python, Ruby e JavaScript, in modo che dire di shell di linux?

la shell supporta tale sintassi?

for i in list: 
do 
    print i 
done 

avrei prima inizializzare un elenco, ad esempio:

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

quindi scorrere su di esso

è che quando possibile programmare script shell?

+1

Nota anche che la shell Bourne/POSIX non ha matrici. Ma il 'per la voce nella lista di oggetti; do' construct è certamente supportato in tutte le shell. Si noti anche l'uso conveniente del globbing per eseguire il loop su un insieme di file; 'per file in un * .dat' costruisce un elenco di token espandendo il carattere jolly (sebbene purtroppo molti utenti riescano a distruggerlo facendo qualcosa come' per file in $ (ls a * .dat) '). – tripleee

risposta

45

Supporta gli elenchi, ma non come una struttura di dati separata (ignorando gli array per il momento).

I for ciclo iterazioni su un elenco (in senso generico) di valori separate da spazi vuoti, indipendentemente da come viene creata quella lista, anche letteralmente:

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

o tramite l'espansione di parametro:

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

o sostituzione di comando:

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

An arra y è solo un parametro speciale che può contenere un elenco di valori più strutturato, in cui ogni elemento può contenere spazi bianchi. Confronta la differenza:

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

Cosa significa @? –

+2

È un indice speciale che fa sì che l'espansione produca tutti gli elementi dell'array, non solo un elemento specifico. – chepner

+0

Non capisco perché 'per i in" $ {array [@]} ";' stampa 3 righe. Poiché 'echo $ {array [@]}' stampa una riga singola 'elemento 1 elemento 2 elemento 3', mi aspetto che' for i in "$ {array [@]}"; 'sia convertito in' for i in "item 1 item 2 item 3"; '; quindi risulterebbe in una singola riga 'item 1 item 2 item 3'.Cosa mi manca? Grazie in anticipo – Svech87

7

Per fare una lista, è sufficiente farlo

colors=(red orange white "light gray") 

Tecnicamente è un array, ma - ovviamente - ha tutte le caratteristiche della lista.
Anche l'elenco python viene implementato con l'array

+1

Per eseguire un'iterazione sull'array, utilizzare 'per l'elemento in $ {colors [*]}; fai echo $ oggetto; done' – neevek

+8

@Neevek che non farà quello che pensi che faccia; "grigio chiaro" sarà trattato come due elementi "chiaro" e "grigio". Devi usare '" $ {colors [@]} "' ('@' not '*', e citato). – chepner

+0

perché "grigio chiaro" verrà considerato come due elementi quando * è usato? dove posso trovare i documenti per tali dettagli? uomo? – hugemeow