Tutoriales

Bash Scripting: bucle for explicado con ejemplos

[*]

En las secuencias de comandos de bash shell, los bucles son útiles para automatizar tareas repetitivas. Si necesita repetir una tarea N veces en su secuencia de comandos, use bucles. Hay tres tipos de bucles que se admiten en bash.

  1. En bucle
  2. Mientras bucle
  3. Bucle hacia arriba

Los tres bucles tienen el mismo propósito de repetir la tarea N veces cuando se cumple una condición, pero con diferencias en la forma en que se definen y utilizan para lograr el resultado.

Este artículo se centra en el «bucle for» de los scripts bash. Conoceremos los otros dos bucles en nuestra próxima guía.

Para la sintaxis de bucle

Comprender la sintaxis es muy importante antes de escribir la primera. 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árdelos en la variable para cada iteración.
  • La palabra clave "do" y "done" marca el comienzo y el final del bloque de bucle y el comando debe escribirse dentro de do and done.
  • No hay reglas de sangría estrictas, pero úselas para facilitar la lectura. 2 lugares o Lengüeta (4). Sea consistente en el uso de espacios o tabulaciones en su guión.

También puede crear una sola línea para bucles. A … crear 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 sencillo.

De la sección anterior, es posible que haya entendido que el for loop acepta una lista de elementos. La lista de elementos puede constar de cadenas, matrices, números enteros, áreas, salida de comandos, etc.

Abra Terminal y ejecute el siguiente código.

N=1
for val in Welcome To Ostechnix
do
 echo "Iteration $N → $val"
 ((++N))
done

Vamos a analizarlo.

  • "Welcome to Ostechnix" es la lista de elementos adjuntos a la for loop y cada palabra se selecciona como una iteración separada y se almacena en una variable (val).
  • La variable puede recibir cualquier nombre. Aquí lo llamo como val.
  • Hay tres elementos en la lista, por lo que hay tres iteraciones en el for loop y cada vez el valor de la variable val está impreso.
  • El comando ((++N)) actúa como contador y aumenta el valor de la variable N para que se pueda imprimir en echo Opinión.
por ejemplo de bucle

Ahora, después de hacer lo anterior for loop Comando presione la tecla de flecha hacia arriba desde el terminal y puede usar la multilínea for loop se convierte en una sola línea para un bucle.

Ejemplo 2: trabajar con áreas

Es posible que quieras eso for loop norte varias veces, puede utilizar el generador de secuencia integrado de Bash para este "x..y[..incr]" lo que crea una secuencia de números.

  • X = Valor inicial entero
  • Y = Valor entero final
  • Incr = valor entero opcional que incrementa números enteros

Suponga que desea hacer un bucle for cinco veces, luego puede usar el siguiente fragmento.

for rng in 1..5
do
 echo "Value is == $rng"
done
para bucle con área
para bucle con área

También puede utilizar el parámetro opcional Incremento, que realiza incrementos incrementales.

Eche un vistazo al siguiente fragmento, que muestra el incremento de tres. Esto genera la secuencia a partir de uno y ejecuta un incremento desde tres hasta el valor final diez.

for rng1 in 1..10..3
do
 echo "Value is == $rng1"
done
Aumentar los valores en el bucle for
Aumentar los valores en el bucle for

Ejemplo 3: ejecución de comandos

Puede ejecutar cualquier comando que derive una lista de elementos para procesar for loop. El comando debe estar entre una marca de verificación «``«o corchetes»$()«.

En el siguiente ejemplo, estoy ejecutando el comando que obtiene el ID del proceso y filtra los últimos cinco procesos. El bucle for ahora se ejecuta a través de cada ID de proceso.

for list in $(ps -ef | awk ' print $2 ' | tail -n 5)
do 
  echo $list
done
Ejecutar comando en bucle for
Ejecutar comando en bucle for

Ejemplo 4: bucle sobre elementos de matriz

En escenarios en tiempo real, almacenará algunos valores en matrices e intentará iterar a través de 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 la siguiente sección de código en Terminal. Un acuerdo X creado y cuando intento imprimir todos los valores ($X) cuando imprimo variables, solo devuelve el primer valor de la matriz.

$ X=( 16 09 2021 "Thursday Third Week" )
$ echo $X
16
Imprimir elementos de matriz
Imprimir elementos de matriz

Para acceder a todos los elementos de una matriz, debe [email protected] o $*. La sintaxis para acceder a los valores de la matriz es la siguiente.

$ echo $X[@]
16 09 2021 Thursday Third Week
$ echo $X[*]
16 09 2021 Thursday Third Week
Expansión de matriz
Expansión de matriz

Usa esto ahora 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
Recorrer elementos de matriz
Recorrer elementos de matriz

Mira el resultado de arriba. Este resultado parece incorrecto porque la cadena (jueves 3 de semana) debe verse como un valor único dentro de la matriz. Pero aquí cada elemento se trata como un elemento separado.

Este es el comportamiento predeterminado al usar [email protected] o $. Para solucionar esto, incluya la variable de extensión de matriz ([email protected] o $) entre comillas dobles.

for items in "$X[@]"
do
 echo $items
done

Si usa comillas dobles, [email protected] y $* comportarse de manera diferente. Tiempo [email protected] expande la matriz a cualquier elemento en un estado similar a una matriz como se muestra en el ejemplo anterior, $* expandirá toda la matriz como un valor.

for items in "$X[*]"
do
 echo $items
done
Uso de comillas dobles con $ * en un bucle for
Uso de comillas dobles con $ * en un bucle for

Aviso: Ambos [email protected] y $* comportarse de manera idéntica a menos que esté incluido en comillas. Tratar de evitar $* a menos que sea necesario.

Ejemplo 5: estilo C para sintaxis de bucle

Bash también ofrece C. estilo for loop Sintaxis. Si de un C. Trasfondo del idioma, entonces esta sintaxis no es nada nuevo para ti.

En lugar de recorrer una lista en iteración, evalúas una condición y, si la condición es verdadera, se ejecutan los comandos dentro del ciclo.

Hay tres parámetros que debe comprender en esta sintaxis.

  • variable – Una variable solo se inicializa una vez cuando se activa el bucle.
  • Estado – La condición debe ser verdadera para que se ejecute el bucle; de ​​lo contrario, el bucle no se ejecutará.
  • encimera – Esto aumenta el valor de la variable.

Cada parámetro debe ir precedido de un. estar separado punto y coma (;) y debe incluirse en Soportes dobles Como se muestra abajo.

for (( variable; condition; counter ))
do
  Command 1 
  Command 2
  Command N 
done

Eche un vistazo al ejemplo de año bisiesto a continuación.

  • La variable YEAR=2010 se inicializa primero.
  • La condición YEAR<=20 se evalúa y si es cierto el código entre do y el done Se ejecuta el bloque.
  • El contador YEAR++ aumenta el año en un contador. Hasta la variable YEAR se incrementa a 2020, el bucle se repite.
  • Dentro de do y done Bloquear una declaración condicional se escribe para comprobar 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
Encuentra el año bisiesto con la declaración de bucle for
Encuentra el año bisiesto con la declaración de bucle for

Ejemplo 6: uso de la declaración Break, Continue

Hay dos palabras clave de bash integradas que se utilizan para controlar el flujo de sus bucles.

  • Rotura – Sale del bucle y omite cualquier iteración pendiente.
  • Sigue adelante – Omita la iteración actual y devuelva el control al bucle for para ejecutar la siguiente iteración.

Para comprobar si están integrados en Bash o no, utilice type Mando:

$ type break continue
break is a shell builtin
continue is a shell builtin

Veamos brevemente cómo y dónde se pueden usar tanto la pausa como la continuación.

Estoy usando el mismo código que usé en la sección anterior para encontrar el año bisiesto. En este caso, solo necesito el primer año bisiesto entre 2010 y 2020. Si se encuentra ese año, mi ciclo puede terminar.

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
Sentencia de ruptura con bucle for
Sentencia de ruptura con bucle for

De la salida anterior, puede ver for loop iterado, y si se encuentra el primer año bisiesto 2012, break -Se lee la instrucción, se sale del bucle y se devuelve el control al terminal.

Ahora estoy cambiando el mismo código para eso. "continue" Opinión. los continue Sentencia, si se interpreta, omite la iteración actual, es decir, el código que viene después de la sentencia continue, y le devuelve el control. 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
Continúe la declaración con un bucle for
Continúe la declaración con un bucle for

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

Al crear bucles o declaraciones condicionales, no puede dejar el bloque de código en blanco. Bash arroja un error de sintaxis.

Error de sintaxis
Error de sintaxis
Declaraciones condicionales vacías
Declaraciones condicionales vacías

Eche un vistazo a las dos imágenes de arriba. En la primera imagen tengo un. creado for loop pero no hay comandos en el medio do y done. De manera similar, en la segunda imagen, dejé la cláusula else vacía. En cualquier caso, bash no acepta bloques vacíos y arroja errores de sintaxis.

Puedes usar bash incorporado “true" Palabra clave que siempre establece el código de salida en 0 (Éxito).

$ type true
true is a shell builtin

De esta manera, deja el bloque de código vacío sin arrojar los errores de bash.

Verdadera palabra clave
Verdadera palabra clave

diploma

En este tutorial de Bash-for-Loop, comenzamos con la introducción a los bucles y la sintaxis de. comenzó for loop junto con el estilo C. También vimos cómo usar bucles for junto con las instrucciones de control de bucle break y continue en diversas condiciones. Lo veremos en nuestra próxima guía. While y Until Bucles con ejemplos.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba