En la primera parte de este tutorial Bash Scripting, discutimos cómo escribir un script Bash. Exploramos los diversos usos y escenarios únicos en los que los scripts de Bash pueden resultar útiles, lo que constituye un gran ejemplo de lo increíbles que pueden ser.
En esta parte del tutorial, echaremos un vistazo a for
comando, y el while
dominio. Mostraremos cómo podemos usar estos comandos para hacer bucles para iterar sobre una serie de valores.
El bucle For
En Linux, un bucle es lo que usamos para ejecutar comandos en un intervalo específico repetidamente. Los bucles se utilizan en una gran variedad de lenguajes de programación con el mismo propósito.
Hay varios tipos diferentes de bucles en Linux, pero en esta sección del artículo, nos centraremos en el for
bucle.
#!/bin/bash for y in a b c d w x y z > do > echo $y done
Como puede ver en la captura de pantalla anterior, atribuimos la variable "y", que es solo un marcador de posición sin sentido utilizado por el comando, a algunas letras del alfabeto.
Luego pasamos esa variable al echo
comando, y pudo generar nuestras letras a continuación.
Iterando sobre valores simples
Podemos usar el for
comando en un script Bash. Para hacer esto, primero debemos crear un archivo de texto en nuestra terminal Linux. Puede utilizar el touch
comando para crear fácilmente archivos de texto.
$ touch script
La sintaxis anterior creará un archivo de texto que llamaremos "script". Asegúrese de crear su archivo de texto usando .sh
extensión de archivo. Al crear script
, querremos editar en nuestro script real que contiene el for
comando.
Podemos lograr esto ejecutando un par de comandos de edición de archivos de texto diferentes, como nano
comando, y el vi
mando, etc.
Pero recomendamos ir con nano
, ya que es uno de los editores de texto de comando más simples y fáciles de usar en Linux.
$ nano script
La sintaxis anterior abrirá nuestro script
en el editor de texto nano. Aquí, querremos escribir nuestro script.
Tenga en cuenta que este archivo de texto debe contener #!/bin/bash
, que informa al script Bash sobre qué shell usar, por lo que es un componente fundamental para crear correctamente un script Bash.
#!/bin/bash for var in first second third fourth fifth; do echo The $var item done
Iterando sobre valores complejos
En el ejemplo anterior, mostramos cómo usar for
Comando para iterar sobre valores simples en un script Bash creado por el usuario. La palabra simple aquí se refiere a valores que contienen una sola palabra.
Pero a veces, tendrá una lista que incluye, en lugar de lo que vimos en el ejemplo anterior con "primero", algo similar a "el primero", que contiene más de una palabra para un solo valor. Estos valores son lo que llamamos valores "complejos".
Si su lista tiene estos valores complejos, deberá hacer referencia a ellos entre comillas, para que el script entienda que es solo un valor.
#!/bin/bash for var in first "the second" "the third" "I’ll do it"; do echo "This is: $var" done
Sustitución de comandos
También podemos usar la sustitución de comandos en nuestro for
comando en nuestro script Bash.
#!/bin/bash my_file="file01" for var in $(cat $my_file); do echo " $var" done
Aquí usamos la sustitución de comandos con una subcapa Bash, como se ve por el uso del comando cat dentro de $( )
; esto nos permite usar la salida del cat
comando y obtenga el contenido del archivo asumiendo que cada línea tiene una palabra.
Pero si hay espacios en una de estas líneas, cada palabra se considerará un campo. En este caso, deberá indicarle al shell que trate las líneas nuevas como un separador en lugar de espacios.
El separador de campos
De forma predeterminada, el shell de Bash considera los siguientes caracteres como campos.
- Espacio
- Pestaña
- nueva línea
Si su texto incluye alguno de estos caracteres, el shell asumirá que es un campo nuevo y tendrá que cambiar el separador de campo interno o la variable de entorno IFS si necesita usar estos caracteres.
$ IFS=$’n’
La sintaxis anterior hará que el shell Bash considere las líneas nuevas como un separador en lugar de un carácter de espacio.
#!/bin/bash file="/etc/passwd" IFS=$'n' for var in $(cat $file); do echo " $var" done
También puede asignar el separador de campo a dos puntos con IFS
como se muestra a continuación.
$ IFS=:
Bastante fantástico, ¿eh?
Iterando sobre archivos de directorio
También puedes usar el for
bucle en un script Bash para enumerar los archivos en su directorio de inicio.
#!/bin/bash for obj in /home/ubuntu/*; do if [ -d "$obj" ]; then echo "$obj is a folder" elif [ -f "$obj" ]; then echo "$obj is a file" fi done
Este proceso requiere que utilice el if
declaración para comprobar archivos y carpetas. Pero eso no debería representar un gran problema para usted si ha leído la publicación anterior. Pero si por casualidad necesita un repaso, le recomiendo que lo revise.
Utilizamos un comodín llamado asterisco (*) en nuestro script Bash que contiene un for
bucle que nos permite listar los archivos y carpetas en nuestro directorio de inicio. En las secuencias de comandos de Bash, este proceso se denomina "globbing de archivos .” Archivo globbing significa todos los archivos existentes con un nombre.
Tenga en cuenta que las variables en nuestro if
declaración se escriben entre comillas porque los nombres de archivo o carpeta pueden contener espacios. Si hubiéramos omitido este paso, es posible que no hubiéramos podido listar todos los archivos y directorios.
Iterar sobre las líneas del archivo
Podemos usar el for
bucle en un script Bash para iterar sobre el contenido del archivo:
#!/bin/bash IFS=$'n' for text in $(cat /etc/passwd); do echo "This line $text ++ contains" IFS=: for field in $text; do echo " $field" done done
Aquí tenemos dos ciclos, el primer ciclo itera sobre las líneas del archivo y el separador es la nueva línea, la segunda iteración es sobre las palabras en la línea misma y el separador son los dos puntos:
datos del archivo
Puede aplicar esta idea cuando tenga un archivo CSV o cualquier archivo de valores separados por comas. La idea es la misma; solo tienes que cambiar el separador para que se ajuste a tus necesidades.
Para bucle estilo C
Si está familiarizado con el lenguaje C, puede notar que hay algo un poco fuera de lugar en for
bucles en Linux a veces.
Esto se debe a que existen dos formas de escribir for
bucles; la forma estándar de Linux, que ya hemos cubierto al comienzo de este tutorial, y la forma de "estilo C".
for (var= 0; var < 5; var++) { printf(“number is %dn”, var); }
La sintaxis anterior es para for
bucle escrito en C. El estilo C for
loop en Linux está escrito de manera muy similar a esto con algunos pequeños cambios, que se pueden observar a continuación.
for (( variable =inicio; condición; paso de iteración))
for (( var = 1; var < 5; var++ ))
Para ayudar a pintar mejor la imagen, incluiremos un script Bash de ejemplo usando el estilo C for
bucle en nuestra terminal de Linux.
#!/bin/bash for ((var = 1; var <= 10; var++)); do echo "number is $var" done
Pon esto en nuestro archivo de texto y enciéndelo.
El comando Continuar
El Bash continue
El comando ignora los comandos dentro del ciclo externo para la iteración actual y da control a la siguiente. Puede usar este comando para dejar de ejecutar los comandos restantes dentro de un ciclo sin salir del ciclo.
En los siguientes ejemplos, veremos cómo se puede usar este comando en los bucles de secuencias de comandos de Bash en Linux.
El Comando Romper
Puede usar el comando break para salir de cualquier bucle, como los bucles while y till.
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
El ciclo se ejecuta hasta que llega a 14 y luego el comando sale del ciclo.
Veremos algunos ejemplos más de este comando un poco más tarde.
El ciclo while
El ciclo for no es la única forma de realizar un ciclo en Bash scripting. El while
loop hace el mismo trabajo, pero verifica una condición antes de cada iteración. La estructura del while
bucle se puede ver a continuación.
while [ condition ] do commands done
Proporcionaremos un ejemplo con un script Bash.
#!/bin/bash number=10 while [ $number -gt 4 ]; do echo $number number=$(($number - 1)) done
La forma en que funciona este script Bash es simple; comienza con while
comando para verificar si el número es mayor que cero, luego ejecutará el ciclo y el valor del número disminuirá cada vez en 1. En cada iteración del ciclo, el script imprimirá el valor del número. El bucle se ejecutará hasta que ese número llegue a 0.
Bucles anidados
Puede crear bucles dentro de otros bucles, como while
bucle por ejemplo. Estos bucles dentro de un bucle se denominan bucles anidados. Nos sumergiremos en estos examinando primero cómo crear un for
anidado bucle en el siguiente ejemplo.
Múltiples bucles for (for anidados)
En los ejemplos anteriores hasta ahora en este tutorial, hemos mostrado cómo crear for
bucles en un script Bash en Linux. Pero también existe algo que llamamos for
anidado bucles Estos son bucles dentro de otros bucles, o simplemente múltiples bucles, para decirlo de manera simple.
Le mostraremos un ejemplo sencillo de cómo se ve esto, junto con un breve examen y una descripción a continuación.
for y in a b c d e f do for u in a b c d e f do echo "$y$u" done done
Como puede ver en la captura de pantalla anterior, el resultado que recibimos al ejecutar nuestro script en la terminal de línea de comandos de Linux es el siguiente:nuestro texto de ejemplo en cada for
el bucle es "a b c d e f".
Lo que hace nuestro script es hacer eco del texto en el bucle externo junto con el texto del bucle interno.
El script continúa generando el primer campo (en este caso, espacios, lo explicaremos un poco más adelante) del texto en el ciclo externo hasta que todos los campos contenidos en el ciclo interno hayan sido generados.
Una vez completada la salida del bucle interno, nuestro script Bash comenzará a generar el siguiente campo de texto en el bucle externo.
Todo este proceso se repetirá hasta que todos los campos de cada bucle se hayan impreso por completo en la salida de su terminal Linux.
Múltiples ciclos while (while anidados)
Como el for
anidado bucles de comando, también existe while
anidado bucles de comando. Estos funcionan exactamente igual que los bucles anidados para for
dominio; un bucle dentro de otro bucle.
La sintaxis a continuación tendrá un parecido sorprendente con el while
normal. loop, como la estructura de un while
anidado loop es simplemente una forma expandida de la base while
bucle, que se puede observar en la siguiente sintaxis.
while [condition] do statements1 statements2 while [condition] do continue done statements3 done
La sintaxis anterior realizará tareas específicas hasta que se cumplan las condiciones que ha seleccionado. Esto es lo que se llama un bucle. Pero dado que el ciclo del ejemplo anterior está anidado, esto significa que una de las tareas que mencionamos anteriormente es otro ciclo en sí mismo.
Mientras sigue
Hemos mostrado cómo el while
bucle y for
loop puede ser muy útil para ejecutar procesos complejos usando scripts Bash en Linux.
Pero a veces, por varias razones, deberá eliminar uno de los bucles en su script Bash. Este escenario, por brutal que parezca, ocurre a menudo en el trabajo de administración del sistema. Por lo tanto, es posible que desee familiarizarse con este concepto.
En el shell de Bash, el break
comando y continue
El comando puede proporcionar las herramientas necesarias para controlar el flujo de sus bucles de secuencias de comandos de Bash.
Mostraremos cómo funcionan estos comandos individualmente con un par de ejemplos a continuación.
La sintaxis para utilizar brea
comando para salir de un while
bucle es el siguiente:
$ while [ condition ] do commands continue done
El continue
comando break
el comando funciona de manera muy similar y pueden considerarse opuestos entre sí; el continue
el comando funciona exactamente igual que el break
comando, solo que continúa el bucle en lugar de eliminarlo.
Salir del ciclo mientras
El break
El comando elimina el ciclo actual y da control al siguiente comando que sigue a ese ciclo. Puede utilizar este proceso para salir de bucles como for
,while
, etc. La sintaxis del break
El comando es el siguiente:
$ while [ condition ] do commands break done
Pero como mencionamos anteriormente, tanto el continue
comando y el break
El comando se puede usar para otros bucles de script Bash además del while
círculo. Mostraremos cómo usarlos en for
bucle.
Salir del bucle
Puede usar estos comandos de control de bucle en un for
círculo. Usaremos el break
comando para salir de for
bucle en nuestro script Bash.
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
El for
el ciclo se ejecuta hasta que alcanza el número que especificamos en el script bash, que es 14. Al llegar a nuestro número especificado, el break
el comando saldrá del for
bucle.
Declaración Romper If
Acabamos de mostrar cómo podemos usar break
comando para salir de for
bucles, pero también podemos usar este comando para salir del if
instrucción dentro de estos bucles de script Bash.
i=0 while [[ $i -lt 10 ]] do echo "Number: $i" ((i++)) if [[ $i -eq 5 ]]; then break fi done
Continuar declaración
Hacemos lo mismo que hicimos en el ejemplo anterior con continue
comando como hicimos con el break
comando en un while
bucle en un script Bash.
i=0 while [[ $i -lt 10 ]]; do ((i++)) if [[ "$i" == '5' ]]; then continue fi echo "Number: $i" done
Pensamientos finales
Espero que hayas aprendido una o dos cosas nuevas. O, al menos, espero que hayas podido repasar lo que ya sabes. Mis últimas palabras hoy para ti serían que sigas leyendo y practicando.
Gracias.