Bash 'For' Loop: Tutorial y ejemplos

Bash (Bourne Again Shell) es un símbolo del sistema de shell y un lenguaje de secuencias de comandos en los sistemas operativos GNU / Linux. Es el shell predeterminado para la mayoría de las distribuciones de Linux.

Como la mayoría de los lenguajes de secuencias de comandos, Bash proporciona sintaxis de bucle para repetir tareas similares varias veces. En este artículo, aprenderemos a utilizar el por bucle en Bash.

Introducción

Un script de Bash típico contiene una serie de comandos que se ejecutarán uno tras otro. Las variables se pueden usar para almacenar cadenas, valores de índices enteros, resultados de un comando, etc. Se requieren bucles cuando el usuario desea ejecutar un comando en particular varias veces. Es de particular utilidad cuando la salida de un comando está en forma de lista, y en cada resultado de la lista, se debe ejecutar un segundo comando.

Sintaxis general

La sintaxis general para por bucle en Bash es:

porque en hacer ... ... hecho

Aquí el es una variable de Bash, que debe ser un nombre de variable de shell de Linux válido, es decir, el nombre contiene una combinación de letras (az, AZ), números (0-9) y subrayado (_) y debe comenzar con una letra o un guión bajo.

El es un rango personalizado de índices enteros que se enlazarán o una lista personalizada de números enteros o cadenas. También puede contener otro comando de Linux, sin embargo, la salida de dicho comando debe estar separada por espacios o caracteres de nueva línea, es decir, que Bash pueda analizar en una lista (una lista en Bash es básicamente una colección de valores separados por un espacio o una línea nueva ).

Cualquiera que sea el comando (s) que se ejecutará debe colocarse dentro del hacer hecho cuadra.

Veamos algunos ejemplos sencillos.

Bucle en un rango de valores enteros: El siguiente código crea directorios llamados dir1, dir2, dir3 hasta dir10.

para i en {1..10} do mkdir dir $ i done

Bucle en una lista de valores fijos: El siguiente código imprime cada cadena o entero en la lista fija dada.

porque yo en Hola 1 2 3 ¡Adiós! haz eco $ lo hice

Bucle en la salida de un comando: El siguiente código recorre la salida de ls e imprime el nombre de cada archivo en el formato dado.

para i en `ls` do echo" El nombre del archivo es $ i "hecho

Sintaxis basada en expresiones

Una sintaxis basada en expresiones similar al lenguaje de programación C también es posible en Bash:

para ((Expresión 1; Expresión 2; Expresión 3)) hacer ... ... hecho

Aquí, Expresión 1 es la inicialización de las variables de índice. Expresión 2 es la condición en la que se debe salir del bucle; esta condición se comprueba en cada iteración. Expresión 3 especifica el incremento / decremento / modificación en el valor de la (s) variable (s) de índice

El siguiente ejemplo simplemente imprime valores de 0 a 4:

para ((i = 0; i <5; i ++)) echo $ i done

El siguiente ejemplo crea un bucle infinito, ya que no se especifican expresiones:

para ((;;)) haga eco "Presione Ctrl-C para detener" hecho

Romper y continuar

Declaración de ruptura para salida condicional

También podemos usar la declaración condicional Si dentro del bucle. El Si la declaración se puede utilizar con un descanso declaración, para una salida condicional del bucle.

para ((i = 0; i <10; i ++)) hacer si [[$ i -eq 5]] luego romper else echo $ i; fi hecho

El ciclo anterior imprimirá números del 0 al 4. Luego, cuando el valor de i sea 5, saldrá del ciclo. Esto es de particular utilidad cuando se va a salir de un bucle cuando un comando da una salida específica. Por ejemplo, el siguiente ciclo se interrumpe cuando encuentra un archivo vacío.

para el archivo en `ls` do flen =` wc -c $ file` if [["$ flen" = "0 $ file"]] entonces echo "$ file is empty" break else echo $ flen fi done 

El comando wc -c imprime el número de líneas en el archivo . Lo imprime en el formato , por ejemplo, 10 test.txt. Estamos saliendo del ciclo cuando el número de líneas es 0, es decir, un archivo vacío.

Continuar declaración para omitir una iteración condicionalmente

Similar a C y muchos otros lenguajes de programación, bash también tiene un Seguir declaración, para omitir la parte restante de una iteración en un ciclo si se satisface una condición particular.

para ((i = 0; i <10; i ++)) hacer si [[$ i -eq 5]] luego continuar fi echo $ i; hecho

El ciclo anterior imprimirá números del 0 al 10, excepto el 5, porque durante la iteración de i = 5 hay una instrucción continue, que omitirá el resto del código en el ciclo al principio con la iteración de i = 6.

En el siguiente ejemplo, imprimimos el número de líneas en un archivo, y una iteración particular Seguir si es un directorio y no un archivo.

para el archivo en `ls` hacer si [[-d $ archivo]] luego continuar fi wc -c" $ archivo "hecho

[[-d $ archivo]] comprueba si el archivo es un directorio. Si es así, saltamos al siguiente archivo, es decir, a la siguiente iteración. Si no es un directorio, imprimimos el número de líneas en el archivo usando WC comando, como se mostró anteriormente también.

Uso de bucles: secuencias de comandos y línea de comandos

La sintaxis de bucle se puede utilizar en el shell Bash directamente o desde un archivo de script de shell. Una vez por La sintaxis de bucle se ingresa en el shell, el shell continúa el indicador para permitir que el usuario continúe con los comandos que se ejecutarán en bucle.

O bien, el usuario puede guardar esto en un archivo de secuencia de comandos y ejecutar el archivo de secuencia de comandos.

El #! / bin / bash at the start especifica el intérprete que se utilizará cuando se ejecute el archivo. Aunque Bash es el shell más utilizado hoy en día, algunos usuarios prefieren shells como zsh, que debe especificarse en lugar de bash al comienzo de este archivo.

Para dar permisos de ejecución para este archivo, ejecute:

chmod + x test.sh

Por fin, para ejecutar el archivo, correr:

./test.sh

Conclusión

El por El bucle en Bash es una característica bastante simple, pero se puede usar en casi todos los tipos de escenarios de secuencias de comandos complejas. Aprenderlo es de gran utilidad, ya sea que sea un usuario regular o avanzado de Linux, o que esté comenzando a aprender la automatización para las tareas de administración de sistemas y DevOps.