2011-01-31 14 views
11

Quiero escribir un bucle anidado que debe funcionar en el indicador bash shell. anidado para el bucle en el comando de una sola línea.bash shell anidado para el bucle

Por ejemplo,

for i in a b; do echo $i; done 
a 
b 

En el ejemplo anterior, para el bucle se ejecuta en un solo derecho línea de comandos. De esta manera, he intentado con el bucle for anidado en el indicador del shell. No funciona. Cómo hacer esto. Por favor actualizarme sobre esto.

+0

-bash-3.00 # para i en a b; hacer eco $ i; hecho a b -bash-3.00 # – rashok

+0

en los comentarios anteriores he mencionado para reprimir la nueva línea ... el comando es "para i en ab; do echo $ i; hecho" – rashok

+0

Por favor, EDITA tu pregunta, hazlo no agregue este tipo de comentarios. He editado para resaltar el código ... – Drakosha

Respuesta

16

Esto no es un bucle anidado, solo un bucle. Y la versión anidada funciona, también:

# for i in a b; do for j in a b; do echo $j; done; done 
a 
b 
a 
b 
+1

ya lo he intentado ... recibo un error ... "error de sintaxis cerca del token inesperado 'echo'" ... estoy intentando esto en bash ... – rashok

+1

Lo hice en bash ... qué shell son estás usando? Al menos etiquetó esta pregunta como "bash", por lo que debería estar clara. – Daniel

+1

@ashok: Ese error probablemente significa que te estás perdiendo un 'do' en alguna parte. –

21

Uno una línea (punto y coma es necesario):

for i in 0 1 2 3 4 5 6 7 8 9; do for j in 0 1 2 3 4 5 6 7 8 9; do echo "$i$j"; done; done 

con formato de legibilidad (no hay punto y coma es necesario):

for i in 0 1 2 3 4 5 6 7 8 9 
do 
    for j in 0 1 2 3 4 5 6 7 8 9 
    do 
     echo "$i$j" 
    done 
done 

Hay diferentes puntos de vista sobre cómo el código de shell debe ser distribuido en múltiples líneas; eso es lo que normalmente uso, a menos que coloque la siguiente operación en la misma línea que el do (guardando dos líneas aquí).

+0

¿Por qué no hacer algo así como para i en $ (seq 0 9) en lugar de escribir cada número en la secuencia? – SummerEla

+2

@SummerEla: Podría '$ (seq 0 9)'; en Bash, podrías escribir 'for i in {0..9}' también. Hay muchas maneras en que se podría usar. La ventaja de no usar 'seq' es que ahorra procesos (11 de ellos). Es poco probable que descubras que eso es un problema, pero es una razón nominal para usar una de las notaciones alternativas (la de la respuesta o la de la llave). Tenga en cuenta que la expansión del corsé no es muy flexible, y tampoco lo es la lista de números escrita. La notación 'seq' le permite controlar el rango con límites variables. Todo depende de lo que estás buscando. –

+0

Gran explicación, gracias @Johnathan Leffler – SummerEla

3
#!/bin/bash 
# loop*figures.bash 

for i in 1 2 3 4 5 # First loop. 
do 
    for j in $(seq 1 $i) 
    do 
     echo -n "*" 
    done 
    echo 
done 
echo 
# outputs 
# * 
# ** 
# *** 
# **** 
# ***** 

for i in 5 4 3 2 1 # First loop. 
do 
    for j in $(seq -$i -1) 
    do 
     echo -n "*" 
    done 
    echo 
done 

# outputs 
# ***** 
# **** 
# *** 
# ** 
# * 

for i in 1 2 3 4 5 # First loop. 
do 
    for k in $(seq -5 -$i) 
    do 
     echo -n ' ' 
    done 
    for j in $(seq 1 $i) 
    do 
     echo -n "* " 
    done 
    echo 
done 
echo 

# outputs 
#  * 
# * * 
# * * * 
# * * * * 
# * * * * * 

for i in 1 2 3 4 5 # First loop. 
do 
    for j in $(seq -5 -$i) 
    do 
     echo -n "* " 
    done 
    echo 
    for k in $(seq 1 $i) 
    do 
     echo -n ' ' 
    done 
done 
echo 

# outputs 
# * * * * * 
# * * * * 
# * * * 
# * * 
#  * 


exit 0 
+2

Proporcione algunas explicaciones además del código. – Jan

Cuestiones relacionadas