En las secuencias de comandos de shell de Bash, los bucles son útiles para automatizar tareas repetitivas. Cuando tiene que repetir una tarea N número de veces en su secuencia de comandos, se deben usar bucles. Hay tres tipos de bucles admitidos en bash.
- Para bucle
- Mientras bucle
- Hasta bucle
Los tres bucles tienen el mismo propósito de repetir la tarea N número de veces cuando se cumple una condición, pero con diferencias en cómo se definen y utilizan para lograr el resultado.
Este artículo se centrará en el "bucle for" en las secuencias de comandos de Bash. Aprenderemos sobre los otros dos bucles en nuestra próxima guía.
Para la sintaxis del bucle
Comprender la sintaxis es muy importante antes de escribir su primer for loop
.
for NAME in [ LIST OF ITEMS ] do Command 1 Command 2 ..... Command N done
Analicémoslo y veamos qué hace.
- Empiece con la palabra clave
"for"
seguido de un nombre de variable. - La palabra clave
"in"
obtenga la lista de elementos y guárdela en la variable para cada iteración. - La palabra clave
"do"
y"done"
marca el inicio y el final del bloque de bucle y el comando debe escribirse dentro de do y done. - No hay reglas de sangría estrictas, pero para una mejor legibilidad use 2 espacios o pestaña(4) . Sea coherente en el uso de espacios o tabulaciones en todo el script.
También puede crear una sola línea para bucles. Crear un for loop
en la terminal y presione la tecla de flecha hacia arriba y verá que bash lo convierte automáticamente en un bucle de una sola línea.
for NAME in [ LIST OF ITEMS]; do COMMANDS ; done
Ejemplo 1:trabajar con una lista de elementos
Comencemos con un ejemplo simple.
De la sección anterior, es posible que haya entendido que el for loop
acepta una lista de elementos. La lista de elementos puede ser cualquier cosa, como cadenas, matrices, enteros, rangos, salida de comando, etc.
Abra la terminal y ejecute el siguiente fragmento de código.
N=1 for val in Welcome To Ostechnix do echo "Iteration $N → $val" ((++N)) done
Vamos a desglosarlo.
"Welcome to Ostechnix"
es la lista de elementos pasados alfor loop
y cada palabra se seleccionará como una iteración separada y se almacenará en una variable (val
).- La variable puede tener cualquier nombre. Aquí lo nombro como
val
. - Hay tres elementos en la lista, por lo que habrá tres iteraciones en el
for loop
y cada vez que el valor de la variableval
está impreso. - El comando ((
++N
)) actuará como un contador e incrementará el valor de la variableN
para que se pueda imprimir en elecho
declaración.
Ahora, después de ejecutar el for loop
anterior presione la tecla de flecha hacia arriba desde la terminal y podrá ver el for loop
de varias líneas se convierte en una sola línea para un bucle.
Ejemplo 2 - Trabajar con rangos
Es posible que desee ejecutar el for loop
N número de veces, para eso, puede usar el generador de secuencia incorporado de bash "{x..y[..incr]}"
que generará una secuencia de números.
X
=Valor entero inicialY
=Valor entero finalIncr
=valor entero opcional que incrementa los números enteros
Digamos que desea ejecutar el bucle for cinco veces, luego puede usar el siguiente fragmento.
for rng in {1..5} do echo "Value is == $rng" done
También puede usar el parámetro de incremento opcional que hará incrementos paso a paso.
Eche un vistazo al fragmento a continuación donde se da el incremento de tres. Esto generará la secuencia desde uno y hará un incremento de paso de tres hasta el valor final diez.
for rng1 in {1..10..3} do echo "Value is == $rng1" done
Ejemplo 3 - Ejecución de comandos
Puede ejecutar cualquier comando que derive una lista de elementos para ser procesados por for loop
. El comando debe incluirse entre marcas "``
" o corchetes "$()
".
En el siguiente ejemplo, estoy ejecutando el comando que obtendrá la ID del proceso y filtrará los últimos cinco procesos. For loop ahora iterará a través de cada ID de proceso.
for list in $(ps -ef | awk {' print $2 '} | tail -n 5) do echo $list done
Ejemplo 4 - Bucle sobre los elementos de la matriz
En escenarios en tiempo real, almacenará algunos valores en matrices e intentará recorrer la matriz para su posterior procesamiento.
Antes de comprender cómo iterar a través de una matriz, debe comprender el comportamiento de dos variables especiales ( [email protected]
y $*
). Ambas son variables especiales que se utilizan para acceder a todos los elementos de una matriz.
Ejecute el siguiente fragmento de código en la terminal. Una matriz X se crea y cuando trato de imprimir todos los valores ($X
) como imprimo variables, solo devuelve el primer valor de la matriz.
$ X=( 16 09 2021 "Thursday Third Week" )
$ echo $X
16
Para acceder a todos los elementos de una matriz, debe usar [email protected]
o $*
. La sintaxis para acceder a los valores de la matriz será la siguiente.
$ echo ${X[@]}
16 09 2021 Thursday Third Week
$ echo ${X[*]}
16 09 2021 Thursday Third Week
Ahora usa esto con for loop
para iterar a través de los valores de la matriz.
X=( 16 09 2021 "Thursday Third Week" ) for items in ${X[@]} do echo $items done
Eche un vistazo a la salida anterior. Esta salida parece ser incorrecta, porque la cadena (Thursday Third Week) dentro de la matriz debe considerarse como un valor único. Pero aquí cada artículo se trata como un artículo separado.
Este es el comportamiento predeterminado cuando usa [email protected]
o $
. Para solucionar esto, incluya la variable de expansión de matriz ([email protected]
o $
) entre comillas dobles.
for items in "${X[@]}" do echo $items done
Cuando usa comillas dobles, [email protected]
y $*
comportarse de manera diferente. Mientras que [email protected]
expande la matriz a cada elemento en una matriz como se muestra en el ejemplo anterior, $*
expandirá toda la matriz como un valor.
for items in "${X[*]}" do echo $items done
Aviso: Ambos [email protected]
y $*
comportarse de forma idéntica a menos que esté encerrado entre comillas dobles . Intenta evitar $*
a menos que sea necesario.
Ejemplo 5 - Estilo C para sintaxis de bucle
Bash también ofrece c estilo for loop
sintaxis. Si son de una C trasfondo del idioma, entonces esta sintaxis no será nueva para usted.
En lugar de iterar a través de una lista, evaluará una condición y, si la condición es verdadera, se ejecutarán los comandos dentro del bucle.
Hay tres parámetros que debe comprender en esta sintaxis.
- Variable - Una variable se inicializa solo una vez cuando se activa el bucle.
- Condición - La condición debe ser verdadera para que se ejecute el ciclo; de lo contrario, el ciclo no se ejecutará.
- Contador - Esto incrementará el valor de la variable.
Cada parámetro debe estar separado por un punto y coma (;
) y debe estar entre corchetes dobles como se muestra a continuación.
for (( variable; condition; counter )) do Command 1 Command 2 Command N done
Eche un vistazo al siguiente ejemplo de año bisiesto.
- La variable
YEAR=2010
se inicializará primero. - La condición
YEAR<=20
será evaluado y si es verdadero el código entredo
y eldone
se ejecutará el bloque. - El contador
YEAR++
incrementará el año en una cuenta. Hasta la variableYEAR
se incrementa a2020
, el ciclo iterará. - Dentro de
do
ydone
bloque, la declaración condicional se escribe para verificar si el año es un año bisiesto o no.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else echo "$YEAR = not a leap year" fi done
Ejemplo 6 - Uso de la sentencia Break, Continue
Hay dos palabras clave incorporadas en bash que se utilizan para controlar el flujo de sus bucles.
- Descanso - Sale del bucle y omite las iteraciones pendientes.
- Continuar - Omita la iteración actual y pase el control de vuelta al bucle for para ejecutar la siguiente iteración.
Para verificar si están integrados en bash o no, use type
comando:
$ type break continue break is a shell builtin continue is a shell builtin
Veamos brevemente cómo y dónde se pueden usar tanto romper como continuar.
Estoy usando el mismo código que usé en la sección anterior para encontrar el año bisiesto. En este caso, solo necesito cuál será el primer año bisiesto entre 2010 y 2020. Si se encuentra ese año, mi ciclo puede salir.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" break else echo "$YEAR = not a leap year" fi done
De la salida anterior, puede ver for loop
itera, y cuando se encuentra el primer año bisiesto 2012, break
se lee la instrucción y se sale del bucle y se devuelve el control a la terminal.
Ahora estoy modificando el mismo código para "continue"
declaración. El continue
cuando se interpreta, omitirá la iteración actual, es decir, cualquier código que venga después de continuar y devolverá el control a for loop
para ejecutar la siguiente iteración.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else continue echo "$YEAR = not a leap year" fi done
En la imagen de arriba, puede ver que hay una declaración de eco que la declaración de continuación omite.
Ejemplo 7:uso de declaraciones verdaderas
Cuando crea bucles o declaraciones condicionales, no puede dejar el bloque de código vacío. Bash arrojará un error de sintaxis.
Echa un vistazo a las dos imágenes de arriba. En la primera imagen, creé un for loop
pero no hay comandos entre do
y done
. De manera similar, en la segunda imagen, dejé la cláusula else vacía. En ambos casos, bash no acepta bloques vacíos y genera errores de sintaxis.
Puede usar bash incorporado “true"
palabra clave que siempre establecerá el código de salida en 0 (éxito).
$ type true true is a shell builtin
De esta manera, está dejando el bloque de código vacío sin que bash arroje ningún error.
Conclusión
En esta guía de Bash for loop, comenzamos con la introducción a los loops y la sintaxis de for loop
junto con el estilo C. También hemos visto cómo usar los bucles for en diferentes condiciones junto con las sentencias de control de bucles break y continue. Consulte nuestra próxima guía para aprender sobre Bash While
y Until
bucles con ejemplos.
- Secuencias de comandos de Bash:ciclo while y till explicado con ejemplos
Lectura relacionada:
- Bash Scripting:funciones explicadas con ejemplos
- Secuencias de comandos de Bash:variables explicadas con ejemplos
- Comando Bash Echo explicado con ejemplos en Linux
- Tutorial de Bash Heredoc para principiantes
- Redireccionamiento de Bash explicado con ejemplos
- Diferencia entre la definición de variables Bash con y sin exportación