Hay muchas ocasiones en un script de shell en las que desea ejecutar repetidamente una declaración o un grupo de declaraciones hasta que se produzca alguna condición específica. Además, es posible que desee ejecutar un grupo de instrucciones para cada elemento de una lista determinada. El shell proporciona tres construcciones de bucle para estas situaciones:las construcciones for, while y till.
El ciclo for le permite especificar una lista de valores. Se ejecuta un grupo de instrucciones para cada valor de la lista.
Para la sintaxis del bucle
El bucle for en el shell toma una lista de palabras (cadenas) como argumento. El número de palabras en la lista determina el número de veces que se ejecutan las sentencias en el bucle for. La sintaxis del bucle for es:
for variable in element1 element2 element3 do commands done
donde:
- variable :Es cualquier nombre de variable.
- elementos (argument_list) :puede ser cualquier lista de palabras, cadenas o números, y puede ser literal o generarse mediante un comando de shell o un metacarácter de línea de comando de shell.
- comandos :Los comandos pueden ser cualquier comando del sistema operativo, un programa de usuario, un script de shell o una declaración de shell que devuelve (produce) una lista.
El valor de la variable var se establece en la primera palabra de la lista la primera vez que se pasa por el bucle. La segunda vez que pasa por el bucle, su valor se establece en la segunda palabra de la lista, y así sucesivamente. El ciclo termina cuando var ha tomado cada uno de los valores de la lista de argumentos, a su vez, y no quedan argumentos.
La lista de argumentos de bucle for
La lista de argumentos en un ciclo for puede ser cualquier lista de palabras , cadenas o números . Genere la lista de argumentos usando cualquiera de los siguientes métodos (o una combinación de métodos):
- Usar una lista explícita
- Usar el contenido de una variable
- Usar argumentos de línea de comandos
- Usar sustitución de comandos
- Usar nombres de archivos en sustitución de comandos
Ejemplo 1:bucle For utilizando una lista explícita para especificar argumentos
Cuando se enumeran argumentos para un bucle for, se denominan lista explícita. Una lista explícita es la forma más simple de una lista de argumentos. El bucle se ejecuta una vez para cada elemento de la lista. El siguiente ejemplo es un bucle for que usa una lista explícita de elementos:
#!/bin/bash for fruit in apple orange banana peach kiwi do echo "Value of fruit is: $fruit" done
La salida de este ciclo for es:
Value of fruit is: apple Value of fruit is: orange Value of fruit is: banana Value of fruit is: peach Value of fruit is: kiwi
Ejemplo 2:Bucle For usando contenido variable para especificar argumentos
Cuando los argumentos están en una variable y se ejecuta la sentencia, se sustituyen los contenidos de la variable. En el siguiente ejemplo, el texto ingresado en el indicador se convierte en el valor de la variable INPUT. Esta variable representa la lista de argumentos de la construcción for. Por lo tanto, el texto en INPUT se divide en palabras o tokens según el espacio en blanco.
$ cat ex1.sh #!/bin/bash # Script name: ex1.sh echo "Enter some text: \c" read INPUT for var in $INPUT do echo "var contains: $var" done
$ ./ex1.sh Enter some text: I like the Bash shell. var contains: I var contains: like var contains: the var contains: Korn var contains: shell.
Ejemplo 3:bucle For utilizando argumentos de línea de comandos para especificar argumentos
En el siguiente ejemplo, el texto ingresado en la línea de comando se convierte en la lista de argumentos de la construcción for. Por lo tanto, el texto de la línea de comandos se divide en palabras o tokens en función de los espacios en blanco.
$ cat ex2.sh #!/bin/bash # Script name: ex2.sh for var in $* do echo "command line contains: $var" done
$ ./ex2.sh I am The Geek. command line contains: I command line contains: am command line contains: The command line contains: Geek.
Ejemplo 4:bucle For utilizando la sustitución de comandos para especificar argumentos
La sintaxis para la sustitución de comandos en un shell Bash es:
for var in `cmd_sub`
El siguiente ejemplo utiliza la salida del comando cat como lista de argumentos.
$ cat fruit1 apple orange banana peach kiwi
$ cat ex4.sh #!/bin/bash # Script name: ex4.sh for var in `cat fruit2` do echo "var contains: $var" done
$ ./ex4.sh var contains: Apple var contains: Orange var contains: Banana var contains: Peach var contains: Kiwi
Si el archivo que contiene la lista tenía el siguiente formato, ¿cuál es el resultado del bucle for?
$ cat fruit3 Apple Orange Banana Peach Kiwi
$ cat ex5.sh #!/bin/bash # Script name: ex5.sh for var in `cat fruit3` do echo "$var" done
$ ./ex5.sh Apple Orange Banana Peach Kiwi
En el ejemplo anterior, los resultados no cambian. La variable IFS es cualquier espacio en blanco, por lo que tanto un retorno de carro como un espacio o tabulación separan cada campo en el archivo.
Ejemplo 5:bucle For usando nombres de archivo en la sustitución de comandos para especificar argumentos
Algunos comandos proporcionan nombres de archivos y nombres de directorios como salida. En el siguiente ejemplo, el shell sustituye la salida del comando, ls /etc/p*(/etc/passwd/etc/profile, etc.), como lista de argumentos para el bucle for.
$ cat ex7.sh #!/bin/bash # Script name: ex7.sh for var in `ls /etc/p*` do print "var contains: $var" done
# ./x.sh var contains: /etc/passwd var contains: /etc/passwd- var contains: /etc/printcap var contains: /etc/profile ....Bash ejemplos de bucles if (si entonces fi, si entonces elif fi, si entonces más fi)