Este es un artículo de seguimiento en el ciclo de bash que explica el artículo anterior en bucle. En este artículo, veremos dos bucles de bash más, a saber while
y until
Cinta.
los while
El bucle se usa principalmente cuando necesita leer y procesar el contenido del archivo. Leer y escribir en un archivo son operaciones comunes al escribir scripts bash. Veremos cómo usar un. leer while
Cinta.
Ya tenemos un artículo muy detallado sobre cómo escribir en un archivo usando operadores de redirección.
La funcionalidad del while
Loop es similar a for
Cinta. los for
El bucle itera sobre una lista de elementos y ejecuta el bloque de código N varias veces. Aquí en while
Loop evalúa la condición primero, y si la condición es verdadera, el bloque de código se ejecuta hasta que la condición se evalúa como falsa.
Tabla de Contenidos
1. Mientras que el bucle
abajo esta el while
Sintaxis de bucle. El ciclo comienza con el «tiempo» Palabra clave seguida de una condición para evaluar como verdadera. Entre do
y done
bloque es donde se colocarán sus códigos, repetidos N veces.
while [[ condition ]] do Command 1 Command 2 .... Command 3 done
EJEMPLO 1 – Evaluar e iterar
Eche un vistazo al siguiente ejemplo. Aquí creé una variable "NUM=5"
y mi condición$NUM -ne 0
), el bucle se ejecuta cuando la variable NUM
no es cero.
$ NUM=5 while [[ $NUM -ne 0 ]] do printf "Value of NUM = $NUM n" ((--NUM)) done
Deberías usar encimera para aumentar o disminuir los valores almacenados en las variables cuando presiona. trabaja while
Cintas Si no, se repetirá y NUM
siempre se establece en cinco. Aquí estoy bajando el valor de NUM
en cada iteración ejecutando ((--NUM))
, entonces si mi variable NUM
se establece en cero, se sale 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
En un bucle infinito, su condición siempre se evaluará como verdadera y el bucle nunca saldrá.
Para crear bucles infinitos, puede usar el bash incorporado true
Palabra clave. También use el "sleep"
Comando al probar bucles infinitos que le dan control para detener el script; de lo contrario, su pantalla se inundará con una salida 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 determina cómo se tratan los límites de las palabras. De forma predeterminada, IFS se establece en espacios, tabulaciones y un carácter de nueva línea. Abra Terminal y ejecute los siguientes comandos:
$ var1="foo:bar foo bar"
$ for val in $var1 do echo $val done
Eche un vistazo a la salida. los for
El bucle itera sobre una cadena y es IFS el que determina los límites de la palabra y considera los espacios como separadores de campo.
Ahora ejecute el siguiente código nuevamente. IFS está preparado para eso aquí Colon.
$ var1="foo:bar foo bar"
$ IFS=":"
$ for val in $var1 do echo $val done
En el resultado anterior, puede ver que los dos puntos se utilizan como separador de campo personalizado como límite de palabra. Puede restablecer el IFS a su estado predeterminado utilizando el unset
Mando.
$ unset IFS
EJEMPLO 4: lectura de un archivo con un bucle while
los while
Se recomienda bucle cuando desee leer y procesar un archivo línea por línea.
Crea un nuevo archivo llamado test.txt
utilizando el siguiente contenido. La línea 2 va seguida de una línea en blanco para mostrar el comportamiento al manejar líneas en blanco.
14:00 Brighton v Leicester 14:00 West Ham v Man Utd 16:30 Spurs v Chelsea
Usaremos eso 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 pasa al while
Cinta. los read
El comando usa el IFS estándar para establecer el punto de interrupción de la palabra.
$ while read line do echo $line done < test.txt
En el ejemplo anterior, test.txt
El archivo se redirigirá a la while
Bucle y read
El comando lee línea por línea y los almacena en la variable «Gestión» y se procesa más dentro del bucle. Las líneas vacías no se saltan con este método y este no es el comportamiento deseado. Por lo tanto, debe asegurarse explícitamente de que se omitan las líneas en blanco.
Hay varias formas de cortar líneas en blanco del archivo de entrada. Puedes usar sed
, awk
y declaraciones condicionales, etc. Prefiero ambas awk
y sed
para limpiar las líneas en blanco antes de usar a. círculo while
Cinta.
# 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 muestra en los ejemplos anteriores, puede cambiar IFS dependiendo de cómo desee leer su archivo. Por ejemplo, si está editando un archivo CSV, el separador se puede establecer en una coma. Cambié el mismo archivo de entrada en formato CSV.
14:00,Brighton,Leicester 14:00,West Ham,Man Utd 16:30,Spurs,Chelsea
En el siguiente ejemplo, IFS está en una coma (IFS=","
) y cada campo se guarda 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 en bucle con interrupción y continuación
Si ha leído nuestro artículo bash for loop, es posible que sepa qué es rotura y Seguir usado para. Tanto romper como continuar son palabras clave integradas en bash para ayudarte a controlar el flujo de tu bucle.
La palabra clave «break» finaliza completamente el ciclo y transfiere el control al siguiente comando del script. En el siguiente ejemplo. Si eso NUM
es igual a tres, el bucle pasa por el break
Mando.
$ 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» omite la iteración actual y devuelve el control al ciclo while e inicia 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 el bucle
los until
Loop es exactamente lo contrario de while
Cinta. los while
Loop evalúa la condición como verdadera para ejecutar el bloque de código y el until
loop evalúa la condición como falsa para que se ejecute el ciclo.
La sintaxis es la misma que la while
Bucle, pero en lugar de la palabra clave while
, until
ser usado.
until [[ condition ]] do Command 1 Command 2 .... Command 3 done
Puede ver en el siguiente ejemplo until
Loop evalúa la variable NUM
ser mayor o igual a cinco. Esta mal ahí NUM
se establece en cero y se incrementa en iteraciones posteriores ((++NUM))
. Cuando entonces NUM
es igual a cinco, la condición se evalúa como verdadera y until
El bucle ya no se ejecuta.
$ NUM=0
$ until [[ $NUM -ge 5 ]] do echo $NUM ((++NUM)) done
Puede usar la palabra clave para crear bucles infinitos «incorrecto».
$ NUM=0
$ until false do echo $NUM ((++NUM)) done
Para controlar el flujo del bucle, puede utilizar el break
y continue
Palabras clave como se muestra en el while
Sección de bucle anterior.
diploma
En este artículo vimos cómo while
Bucle y until
Bucle en scripts bash. Until
Loop se comparará con. rara vez se usa for
y while
Bucles, pero eso depende de su script para decidir y qué tipos de bucles se requieren. Póngase cómodo usando los tres bucles.
Si tiene alguna pregunta o comentario, no dude en hacérnoslo saber utilizando la sección de comentarios a continuación.