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.