GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Scripting – Para bucle explicado con ejemplos

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.

  1. Para bucle
  2. Mientras bucle
  3. 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 ​​al for 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 variable val está impreso.
  • El comando ((++N )) actuará como un contador e incrementará el valor de la variable N para que se pueda imprimir en el echo 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 inicial
  • Y =Valor entero final
  • Incr =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 entre do y el done se ejecutará el bloque.
  • El contador YEAR++ incrementará el año en una cuenta. Hasta la variable YEAR se incrementa a 2020 , el ciclo iterará.
  • Dentro de do y done 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

Linux
  1. Bash For Loop Guía y ejemplos

  2. Golpe para bucle

  3. Ejemplos de ciclos for y while de Bash

  4. 12 ejemplos de Bash For Loop para su secuencias de comandos de Linux Shell

  5. Bash para ejemplos de bucle

Bash Scripting:matriz asociativa explicada con ejemplos

Bash Scripting:matriz indexada explicada con ejemplos

Bash For Loops con ejemplos

Bash Scripting Part2 – Bucles for y while con ejemplos

El Bash FOR Loop explicado y simplificado

Bash Script for Loop explicado con ejemplos