GNU/Linux >> Tutoriales Linux >  >> Linux

Secuencias de comandos de Bash:ciclo while y till explicado con ejemplos

Este es un artículo de continuación en bash loop en el que hemos explicado el artículo anterior sobre for loop . En este artículo, veremos dos bucles bash más, a saber, while y until círculo.

El while loop se usa principalmente cuando tiene que leer el contenido del archivo y procesarlo más. Leer y escribir en un archivo son operaciones comunes cuando escribe scripts bash. Veremos como leer archivos usando un while bucle.

Ya tenemos un artículo muy detallado sobre cómo escribir en un archivo usando operadores de redirección.

  • Redireccionamiento de Bash explicado con ejemplos

La funcionalidad del while el bucle es similar a for círculo. El for loop itera sobre una lista de elementos y ejecuta el bloque de código N varias veces. Aquí en el while bucle, la condición se evalúa primero y, si la condición es verdadera, el bloque de código se ejecutará hasta que la condición se evalúe como falsa.

1. Mientras bucle

A continuación se muestra el while sintaxis de bucle. El ciclo comienza con "while" palabra clave seguida de una condición que debe evaluarse como verdadera. Entre do y done bloque es donde se colocarán sus códigos que se repetirán N veces.

while [[ condition ]]
do
  Command 1
  Command 2
  ....
  Command 3
done

EJEMPLO 1 - Evaluar e iterar

Eche un vistazo al siguiente ejemplo. Aquí he creado una variable "NUM=5" y mi condición ($NUM -ne 0 ) es, el bucle se ejecutará si la variable NUM no es igual a cero.

$ NUM=5
while [[ $NUM -ne 0 ]]
do
  printf "Value of NUM = $NUM \n"
  ((--NUM))
done

Deberías usar contadores para incrementar o disminuir valores almacenados en variables cuando se trabaja con while bucles Si no, se convertirá en un bucle infinito y NUM siempre se establecerá en cinco. Aquí estoy disminuyendo el valor de NUM en cada iteración ejecutando ((--NUM)) , entonces cuando mi variable NUM se establece en cero, la salida del bucle.

((++NUM))  → Increment NUM variable by 1, similar to running NUM=$(( $NUM + 1 ))
((--NUM))  → Decrement NUM variable by 1, similar to running NUM=$(( $NUM - 1 ))

EJEMPLO 2 - Bucles infinitos

Un bucle infinito es donde su condición siempre se evalúa como verdadera y el bucle nunca saldrá.

Para crear bucles infinitos, puede usar el true incorporado en bash palabra clave. Además, use el "sleep" comando al probar bucles infinitos que le darán control para detener el script, de lo contrario, su pantalla se inundará con salidas de desplazamiento rápido.

$ NUM=0
while true
do
  printf "Value of NUM = $NUM \n"
  ((++NUM))
  sleep 2
done

EJEMPLO 3 - Separador de campo interno (IFS)

IFS es una variable de shell especial que decide cómo se manejan los límites de las palabras. De forma predeterminada, IFS se establece en espacio, tabulación y un carácter de nueva línea. Abre la terminal y ejecuta los siguientes comandos:

$ var1="foo:bar foo bar"
$ for val in $var1
do
  echo $val
done 

Echa un vistazo a la salida. El for el bucle está iterando sobre una cadena y es IFS el que decide los límites de las palabras y considera el espacio como un separador de campos.

Ahora ejecute el siguiente código de nuevo. Aquí IFS se establece en los dos puntos .

$ var1="foo:bar foo bar"
$ IFS=":"
$ for val in $var1
do
  echo $val
done

En el resultado anterior, puede ver que los dos puntos del separador de campo personalizado se utilizan como límite de palabra. Puede restablecer el IFS al estado predeterminado ejecutando unset comando.

$ unset IFS

EJEMPLO 4 - Leer archivo usando el ciclo while

El while loop se recomienda cuando desea leer un archivo línea por línea y procesarlo.

Cree un nuevo archivo llamado test.txt utilizando el siguiente contenido. Hay una línea vacía después de la línea 2 para mostrar el comportamiento de cómo se manejan las líneas vacías.

14:00 Brighton v Leicester
14:00 West Ham v Man Utd

16:30 Spurs v Chelsea

Usaremos el read comando que acepta la entrada de la redirección y la almacena en una variable junto con un operador de redirección de entrada donde el nombre del archivo se redirigirá a while círculo. El read El comando utilizará el IFS predeterminado para establecer el límite de división de palabras.

$ while read line
do
  echo $line
done < test.txt

En el ejemplo anterior, test.txt el archivo se redirige a while bucle y read El comando lee línea por línea y lo almacena en la variable "line" y se procesa más dentro del bucle. Las líneas vacías no se saltan cuando sigue este método y este no es el comportamiento que podría desear. Por lo tanto, debe hacer explícitamente que se omitan las líneas vacías.

Hay varias opciones para recortar las líneas vacías del archivo de entrada. Puedes usar sed , awk y sentencias condicionales, etc. Prefiero usar tanto awk y sed para limpiar las líneas vacías antes de repetirlas usando un while bucle.

# USING SED
$ sed -i '/^[[:space:]]*$/d' test.txt
14:00 Brighton v Leicester
14:00 West Ham v Man Utd
16:30 Spurs v Chelsea
# USING AWK
$ awk 'NF' test.txt

Como se vio en los ejemplos anteriores, puede modificar IFS dependiendo de cómo desee leer su archivo. Por ejemplo, si está manejando un archivo CSV, el delimitador se puede establecer en una coma. He modificado el mismo archivo de entrada para que esté en formato CSV.

14:00,Brighton,Leicester
14:00,West Ham,Man Utd
16:30,Spurs,Chelsea

En el siguiente ejemplo, IFS se establece en coma (IFS="," ) y cada campo se almacenará en una variable separada (tiempo, equipo1, equipo2).

while IFS="," read time team1 team2
do
   echo "$team1 is playing against $team2 at $time"
done < test.txt

EJEMPLO 5 - Control de flujo de bucle con Break and Continue

Si ha leído nuestro artículo bash for loop, es posible que sepa qué es romper y continuar usado para. Tanto romper como continuar son palabras clave incorporadas en bash que lo ayudarán a controlar el flujo de su bucle.

La palabra clave "romper" saldrá completamente del ciclo y pasará el control al siguiente comando en el script. En el siguiente ejemplo. Cuando el NUM es igual a tres, se saldrá del ciclo con break comando.

$ NUM=5
while [[ $NUM -ne 0 ]]
do
  printf "Value of NUM = $NUM \n"
  if [[ $NUM -eq 3 ]]
  then
    break
  fi   
((--NUM))
done

La palabra clave "continuar" omitirá la iteración actual y devolverá el control al ciclo while y comenzará la siguiente iteración.

$ NUM=0
while [[ $NUM -lt 5 ]]
do
 ((++NUM))
 if [[ $NUM -eq 3 ]]
 then
   continue
 fi
 printf "Value of NUM = $NUM \n"  
done

2. Hasta Bucle

El until bucle es exactamente lo contrario de while círculo. El while loop evalúa la condición como verdadera para ejecutar el bloque de código y until loop evalúa la condición como falsa para que se ejecute el ciclo.

La sintaxis es la misma que while loop pero en lugar de la palabra clave while , until se utilizará.

until [[ condition ]]
do
  Command 1
  Command 2
  ....
  Command 3
done

En el siguiente ejemplo, puede ver until loop evalúa la variable NUM ser mayor que igual a cinco. Es falso ya que NUM se establece en cero y se incrementará en iteraciones posteriores usando ((++NUM)) . Así que cuando NUM es igual a cinco la condición se evalúa como verdadera y until el bucle dejará de ejecutarse.

$ NUM=0
$ until [[ $NUM -ge 5 ]]
do
  echo $NUM
  ((++NUM))
done

Para crear bucles infinitos, puede usar la palabra clave "false" .

$ NUM=0
$ until false
do
  echo $NUM
  ((++NUM))
done

Para controlar el flujo del bucle, puede usar el break y continue palabras clave como las que se muestran en while sección de bucle anterior.

Conclusión

En este artículo, hemos visto cómo usar while bucle y until bucle en scripts bash. Until loop se usa con menos frecuencia en comparación con for y while bucles, pero eso es para decidir sobre su secuencia de comandos y qué tipos de bucles se requieren. Siéntete cómodo usando los tres bucles.

Si tiene alguna pregunta o comentario, no dude en hacérnoslo saber a través de la sección de comentarios a continuación.

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
  • Cómo repetir un comando hasta que tenga éxito en Linux
  • Diferencia entre la definición de variables Bash con y sin exportación

Linux
  1. Bash For Loop Guía y ejemplos

  2. Comandos de cabeza y cola en Linux explicados con ejemplos

  3. Ejemplos de ciclos for y while de Bash

  4. Manteniéndote al tanto – Bash For, While, Until Ejemplos de bucles

  5. Usando y en Bash while loop

Bash Scripting - Comando Printf explicado con ejemplos

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

Bash Script for Loop explicado con ejemplos