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