
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.
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, awky 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.









