Secuencias de comandos de Bash: ciclo while

Un ciclo while es una declaración que itera sobre un bloque de código hasta que la condición especificada se evalúa como verdadera. Podemos usar esta declaración o bucle en nuestro programa cuando no sabemos cuántas veces la condición se evaluará como falsa antes de evaluar como verdadera.  

La sintaxis de un ciclo while en BASH es similar a la siguiente:

while [ condition ];
do
    # statements
    # commands
done  

Si la condición es falsa, los comandos dentro del bloque while se ejecutan y se iteran nuevamente después de verificar la condición. Además, si la condición es verdadera, las declaraciones dentro del bloque while se omiten y las declaraciones posteriores al bloque while se ejecutan. 

El ejemplo de un ciclo while es el siguiente:

#!/usr/bin/bash 

a=7
while [ $a -gt 4 ];
do
    echo $a
    ((a--))
done

echo "Out of the loop"

Como podemos ver, el ciclo se itera hasta que la condición es verdadera. Tan pronto como la variable a se convierte en 4, la condición se evalúa como verdadera y el bucle salta el bloque de comandos y comienza a ejecutar los comandos después del bloque.

Lectura de un archivo con un bucle while  

Podemos leer un archivo con un bucle while en BASH. Al analizar ciertos parámetros en la condición del ciclo while, podemos iterar sobre el archivo línea por línea o por otros grupos como caracteres o palabras.   

#!/usr/bin/bash 

file=temp.txt

while read -r line;
do
    echo $line
done < "$file"

Usamos el comando read para obtener las líneas o caracteres del archivo. El comando de lectura se pasa con el argumento -r que ignora el escape de caracteres si aparece \ y, por lo tanto, se analiza como suyo. Leemos una línea de un archivo mencionado después de la instrucción done. El comando de lectura lee una línea del archivo mencionado y los bucles while terminan cuando se lee la última línea del archivo (no queda ninguna línea para leer). 

Así es como podemos leer el contenido del archivo usando un ciclo while en BASH. 

Bucle while infinito

Para crear un ciclo infinito usando una instrucción de ciclo while. No necesitamos poner ninguna condición en el ciclo while y, por lo tanto, el ciclo itera infinitamente. El siguiente es el ejemplo de un ciclo while infinito:

#!/usr/bin/bash 

while :
do
  echo "An Infinite loop"
  # We can press Ctrl + C to exit the script
done

Por lo tanto, el ciclo while en el script se repetirá durante un tiempo infinito. Podemos romper manualmente el bucle o el script con CTRL + C.

Mientras bucle para iterar un número fijo de veces

Podemos usar un ciclo while para iterar un número fijo de veces, podemos establecer la condición para que sea -le o menor que igual a un número, y el ciclo iterará hasta que el iterador sea menor o igual que el número provisto en la condición. Además, necesitamos incrementar el iterador manualmente para mantener el iterador de bucle funcionando, o de lo contrario, el bucle continuará para siempre. 

#!/usr/bin/bash 

i=1

# the number 4 can be the limit to 
# iterate the loop
while [ $i -le 4 ];
do
    echo $i
    ((i++))
done

En el ejemplo anterior, podemos ver que el ciclo itera un número definido de veces. Como hemos inicializado el contador a 1 y la condición es iterar el ciclo hasta que el iterador sea menor o igual al número en este caso 4. Por lo tanto, podemos cambiar el número en la condición según nuestro requisito.

Lea el argumento de la línea de comandos con las opciones de getopts

Podemos usar las opciones de obtener operaciones para leer la entrada desde la línea de comando y, si hay varios argumentos, podemos verificarlos y analizarlos uno por uno usando un ciclo while. getopts es una herramienta para obtener la entrada del usuario desde la línea de comandos. Podemos tener múltiples opciones para analizar desde la línea de comandos, y usando getopts y bucles while, podemos hacer un programa de entrada de usuario de aspecto profesional.

#!/bin/bash

while getopts n:a: OPT
do
        case "${OPT}"
        in
           n) name=${OPTARG};;
           a) age=${OPTARG};;
           *) echo "Invalid option"
              exit 1;;
        esac
done

printf "My name is $name and am $age years old\n"

En este caso, tenemos dos opciones a saber, el nombre y la edad, puede tener múltiples opciones. Necesitamos especificar qué opción vamos a usar las declaraciones de cambio de caso y desde la línea de comando usando la opción -taquigrafía. En este caso, hemos usado -n para nombre y -a para edad . También tenemos una verificación de caso predeterminada o inválida para soportar que no analicemos argumentos incorrectos. Podemos asignar el valor de la opción usando la variable OPTARG que analiza el valor proporcionado a la opción. 

El ciclo while aquí se usa para iterar hasta que no haya opciones pasadas desde la línea de comando. Verificamos la opción -n y -a e iteramos hasta que se presiona la tecla de retorno de carro o enter y no hay más opciones para analizar. 

 Bucle while estilo C

Podemos usar el ciclo while con estilo C en BASH, las variables deben evaluarse con el estilo BASH pero la sintaxis general se siente como C. Podemos usar los operadores como <,>, <= y así sucesivamente en la condición del ciclo while y por lo tanto se llama como el ciclo while de estilo C. 

#!/bin/bash

i=0
while((i < 12))
do
   echo $i
   ((i+=2))
done

En este ejemplo, podemos ver que el ciclo while tiene una condición con operadores que no son bash como -le, -ge, etc. En su lugar, usamos los operadores de estilo C en la condición. El resto del ciclo es el ciclo básico como en BASH, la variable o iterador i se incrementa en dos como podemos ver en la última declaración del cuerpo del ciclo. Por lo tanto, el ciclo itera más de 5 veces.

Bucle while para realizar operaciones en un archivo

Podemos realizar operaciones en un archivo, como leer solo una parte particular de un archivo. Si tenemos columnas que están formateadas de una manera particular, podemos usar variables para asignarlas e imprimirlas una vez de datos de fila. 

#!/bin/bash

while read a b c 
do
    echo $b - $a
done < wh.txt

En este ejemplo, tenemos tres filas, leemos los contenidos asignándolos a las variables a, b y c, puede ser lo que quieras, pero recuerda usarlos en el cuerpo del ciclo. Podemos seleccionar una columna en particular como b y a y podemos imprimir o realizar cualquier operación en ellos. Sin embargo, esto no se reflejará en el archivo, ya que son solo las variables del script local.

Escribir en un archivo usando un ciclo while

Podemos escribir en un archivo mediante la entrada del usuario en un ciclo while. Podemos usar el ciclo while para iterar hasta que salgamos manualmente del ciclo usando CTRL + D guardando los cambios en el archivo o CTRL + C para evitar escribir en el archivo. Usamos el comando de lectura para ingresar el texto desde la línea de comando y analizarlo en el archivo. 

#! /bin/bash

file=wh.txt
echo "Enter the content into the file $file"
while read line
do
    echo $line >> $file
done

Entonces, a partir del ejemplo anterior, pudimos ingresar texto en un archivo usando un bucle while y un comando de lectura. Para salir del bucle y guardar los cambios en el archivo, usamos las teclas CTRL+D, y para salir del bucle sin guardar nada en el archivo, podemos usar las teclas CTRL+C. Por lo tanto, ingresamos el texto desde la línea de comando al archivo de texto usando el comando de lectura y un ciclo while.

romper y continuar

Break y continue son esenciales en un programa que se ocupa de sentencias de bucle, ya que controlan el flujo de las sentencias de bucle sin ninguna condición explícita. 

romper declaración

Usamos declaraciones de interrupción para salir del ciclo sin esperar a que la condición del ciclo while se evalúe como verdadera. Esta declaración se puede utilizar dentro de un bloque de bucle. Esto se puede usar para salir de un ciclo infinito con una condición programática dentro del ciclo y así mantener el control del ciclo.

Por ejemplo, tenemos un script que cuenta desde 1 y para siempre. Pero podemos salir del ciclo mediante programación usando una declaración de interrupción dentro del cuerpo del ciclo con una condición. 

#!/usr/bin/bash 

i=1
while :
do
    echo $i
    if [ $i -eq 20 ];
    then
        echo "This is end of the loop"
        break
    if
    ((i++))
done

Desde el script y la ejecución, podemos ver que pudimos romper o salir de un ciclo infinito con una declaración condicional y la declaración de ruptura. Por lo tanto, la instrucción break se usa para obtener el flujo de control de un programa/script desde dentro de un ciclo while para salir del ciclo sin que la condición del ciclo se evalúe como verdadera.

Continuar declaración

Podemos usar la sentencia continue para hacer lo contrario de la sentencia break. Saltará al inicio del bloque de bucle y volverá a iterar. Esto se puede usar para omitir ciertos comandos para ciertas condiciones y, por lo tanto, permite un cambio en el flujo del ciclo. 

Por ejemplo, si tenemos una variable inicializada en 1 y queremos mostrar solo los números divisibles por cinco o en un cierto patrón siguiendo una condición, podemos usar declaraciones continuas para hacer precisamente eso. Esto permite iterar sobre el ciclo de la manera deseada.

#!/usr/bin/bash 

i=1
while [ $i -lt 30 ];
do
    ((i++))
    if [[ $(( $i % 5 )) -ne 0 ]];
    then
        continue
    if
    echo $i
done

Como podemos ver, la sentencia continue, salta al principio del bloque e inicia la ejecución de los comandos saltando los siguientes comandos dentro del bloque. El ciclo while itera solo para que el valor de la variable i sea menor que 30, por lo tanto, la condición if verifica si la variable i es divisible por 5, y si no lo es, iteramos nuevamente usando continuar e incrementar el valor de la variable i. La variable i solo se repite si es divisible por 5, por lo tanto, la condición if se evalúa como falsa y no encontramos una declaración continua y continúa con el flujo normal del ciclo. Esto se hace para evitar el registro de todos los números y solo imprimir los números que no siguen un patrón o condición en la declaración if u otras declaraciones condicionales. 

Publicación traducida automáticamente

Artículo escrito por meetgor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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