2012-09-07 14 views
26

esta pregunta no es lo mismo que Does the shell support sets?¿la estructura de datos de la lista de compatibilidad de linux shell?

sé un montón de estructura de lista de apoyo lenguaje de script, como Python, Python, Ruby y JavaScript, así que ¿qué pasa con shell de Linux?

¿el shell admite tal sintaxis?

for i in list: 
do 
    print i 
done 

me gustaría primero en inicializar una lista, por ejemplo:

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

continuación, iterar sobre ella

es que sea posible en la programación de scripts de shell?

+1

Tenga en cuenta también que el shell Bourne shell/POSIX no tiene matrices. Pero el 'para el artículo en la lista de artículos; do' construct es ciertamente compatible con todas las shells. Tenga en cuenta también el uso conveniente de globbing para recorrer un conjunto de archivos; 'para el archivo en un * .dat' construye una lista de tokens al expandir el comodín (aunque, lamentablemente, muchos usuarios logran arruinarlo haciendo algo como' para el archivo en $ (ls a * .dat) '). – tripleee

Respuesta

45

Admite listas, pero no como una estructura de datos separada (ignorando las matrices por el momento).

Los for itera bucle más de una lista (en el sentido genérico) de valores de espacio en blanco separados, independientemente de cómo se crea esa lista, ya sea literalmente:

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

o por medio de la expansión de parámetro:

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

o comando de sustitución:

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

Un arra y es solo un parámetro especial que puede contener una lista de valores más estructurada, donde cada elemento puede contener espacios en blanco. Compare la diferencia:

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

¿Qué significa @? –

+2

Es un índice especial que hace que la expansión produzca todos los elementos de la matriz, no solo un elemento específico. – chepner

+0

No entendí por qué 'for i in" $ {array [@]} ";' imprime 3 líneas. Como 'echo $ {array [@]}' imprime una sola línea 'item 1 item 2 item 3', esperaría que' for i in "$ {array [@]}"; 'se convierta en' for i in "item 1 item 2 item 3"; '; por lo que resultaría en una sola línea 'item 1 item 2 item 3'.¿Qué me estoy perdiendo? Gracias de antemano – Svech87

7

Para hacer una lista, sólo tiene que hacer eso

colors=(red orange white "light gray") 

Técnicamente es una matriz, pero - por supuesto - que tiene todas las características de la lista.
Incluso la lista de Python se implementa con la matriz

+1

Para iterar sobre la matriz, use 'para el elemento en $ {colores [*]}; hacer eco $ item; hecho' – neevek

+8

@Neevek que no hará lo que crees que hace; "gris claro" se tratará como dos elementos "claro" y "gris". Necesita usar '" $ {colors [@]} "' ('@' not '*', y citado). – chepner

+0

¿por qué "gris claro" se tratará como dos elementos cuando se usa *? donde puedo encontrar documentos para tales detalles? hombre sh? – hugemeow

Cuestiones relacionadas