
[*]
En las secuencias de comandos de bash shell, los bucles son útiles para automatizar tareas repetitivas. Si necesita repetir una tarea N veces en su secuencia de comandos, use bucles. Hay tres tipos de bucles que se admiten en bash.
- En bucle
- Mientras bucle
- Bucle hacia arriba
Los tres bucles tienen el mismo propósito de repetir la tarea N veces cuando se cumple una condición, pero con diferencias en la forma en que se definen y utilizan para lograr el resultado.
Este artículo se centra en el «bucle for» de los scripts bash. Conoceremos los otros dos bucles en nuestra próxima guía.
Para la sintaxis de bucle
Comprender la sintaxis es muy importante antes de escribir la primera. for loop
.
for NAME in [ LIST OF ITEMS ] do Command 1 Command 2 ..... Command N done
Analicémoslo y veamos qué hace.
- Empiece con la palabra clave
"for"
seguido de un nombre de variable. - La palabra clave
"in"
Obtenga la lista de elementos y guárdelos en la variable para cada iteración. - La palabra clave
"do"
y"done"
marca el comienzo y el final del bloque de bucle y el comando debe escribirse dentro de do and done. - No hay reglas de sangría estrictas, pero úselas para facilitar la lectura. 2 lugares o Lengüeta (4). Sea consistente en el uso de espacios o tabulaciones en su guión.
También puede crear una sola línea para bucles. A … crear for loop
en la terminal y presione la tecla de flecha hacia arriba y verá que bash lo convierte automáticamente en un bucle de una sola línea.
for NAME in [ LIST OF ITEMS]; do COMMANDS ; done
Ejemplo 1: trabajar con una lista de elementos
Comencemos con un ejemplo sencillo.
De la sección anterior, es posible que haya entendido que el for loop
acepta una lista de elementos. La lista de elementos puede constar de cadenas, matrices, números enteros, áreas, salida de comandos, etc.
Abra Terminal y ejecute el siguiente código.
N=1 for val in Welcome To Ostechnix do echo "Iteration $N → $val" ((++N)) done
Vamos a analizarlo.
"Welcome to Ostechnix"
es la lista de elementos adjuntos a lafor loop
y cada palabra se selecciona como una iteración separada y se almacena en una variable (val
).- La variable puede recibir cualquier nombre. Aquí lo llamo como
val
. - Hay tres elementos en la lista, por lo que hay tres iteraciones en el
for loop
y cada vez el valor de la variableval
está impreso. - El comando ((
++N
)) actúa como contador y aumenta el valor de la variableN
para que se pueda imprimir enecho
Opinión.
Ahora, después de hacer lo anterior for loop
Comando presione la tecla de flecha hacia arriba desde el terminal y puede usar la multilínea for loop
se convierte en una sola línea para un bucle.
Ejemplo 2: trabajar con áreas
Es posible que quieras eso for loop
norte varias veces, puede utilizar el generador de secuencia integrado de Bash para este "x..y[..incr]"
lo que crea una secuencia de números.
X
= Valor inicial enteroY
= Valor entero finalIncr
= valor entero opcional que incrementa números enteros
Suponga que desea hacer un bucle for cinco veces, luego puede usar el siguiente fragmento.
for rng in 1..5 do echo "Value is == $rng" done
También puede utilizar el parámetro opcional Incremento, que realiza incrementos incrementales.
Eche un vistazo al siguiente fragmento, que muestra el incremento de tres. Esto genera la secuencia a partir de uno y ejecuta un incremento desde tres hasta el valor final diez.
for rng1 in 1..10..3 do echo "Value is == $rng1" done
Ejemplo 3: ejecución de comandos
Puede ejecutar cualquier comando que derive una lista de elementos para procesar for loop
. El comando debe estar entre una marca de verificación «``
«o corchetes»$()
«.
En el siguiente ejemplo, estoy ejecutando el comando que obtiene el ID del proceso y filtra los últimos cinco procesos. El bucle for ahora se ejecuta a través de cada ID de proceso.
for list in $(ps -ef | awk ' print $2 ' | tail -n 5) do echo $list done
Ejemplo 4: bucle sobre elementos de matriz
En escenarios en tiempo real, almacenará algunos valores en matrices e intentará iterar a través de la matriz para su posterior procesamiento.
Antes de comprender cómo iterar a través de una matriz, debe comprender el comportamiento de dos variables especiales ( [email protected]
y $*
). Ambas son variables especiales que se utilizan para acceder a todos los elementos de una matriz.
Ejecute la siguiente sección de código en Terminal. Un acuerdo X creado y cuando intento imprimir todos los valores ($X
) cuando imprimo variables, solo devuelve el primer valor de la matriz.
$ X=( 16 09 2021 "Thursday Third Week" )
$ echo $X
16
Para acceder a todos los elementos de una matriz, debe [email protected]
o $*
. La sintaxis para acceder a los valores de la matriz es la siguiente.
$ echo $X[@]
16 09 2021 Thursday Third Week
$ echo $X[*]
16 09 2021 Thursday Third Week
Usa esto ahora for loop
para iterar a través de los valores de la matriz.
X=( 16 09 2021 "Thursday Third Week" ) for items in $X[@] do echo $items done
Mira el resultado de arriba. Este resultado parece incorrecto porque la cadena (jueves 3 de semana) debe verse como un valor único dentro de la matriz. Pero aquí cada elemento se trata como un elemento separado.
Este es el comportamiento predeterminado al usar [email protected]
o $
. Para solucionar esto, incluya la variable de extensión de matriz ([email protected]
o $
) entre comillas dobles.
for items in "$X[@]" do echo $items done
Si usa comillas dobles, [email protected]
y $*
comportarse de manera diferente. Tiempo [email protected]
expande la matriz a cualquier elemento en un estado similar a una matriz como se muestra en el ejemplo anterior, $*
expandirá toda la matriz como un valor.
for items in "$X[*]" do echo $items done
Aviso: Ambos [email protected]
y $*
comportarse de manera idéntica a menos que esté incluido en comillas. Tratar de evitar $*
a menos que sea necesario.
Ejemplo 5: estilo C para sintaxis de bucle
Bash también ofrece C. estilo for loop
Sintaxis. Si de un C. Trasfondo del idioma, entonces esta sintaxis no es nada nuevo para ti.
En lugar de recorrer una lista en iteración, evalúas una condición y, si la condición es verdadera, se ejecutan los comandos dentro del ciclo.
Hay tres parámetros que debe comprender en esta sintaxis.
- variable – Una variable solo se inicializa una vez cuando se activa el bucle.
- Estado – La condición debe ser verdadera para que se ejecute el bucle; de lo contrario, el bucle no se ejecutará.
- encimera – Esto aumenta el valor de la variable.
Cada parámetro debe ir precedido de un. estar separado punto y coma (;
) y debe incluirse en Soportes dobles Como se muestra abajo.
for (( variable; condition; counter )) do Command 1 Command 2 Command N done
Eche un vistazo al ejemplo de año bisiesto a continuación.
- La variable
YEAR=2010
se inicializa primero. - La condición
YEAR<=20
se evalúa y si es cierto el código entredo
y eldone
Se ejecuta el bloque. - El contador
YEAR++
aumenta el año en un contador. Hasta la variableYEAR
se incrementa a2020
, el bucle se repite. - Dentro de
do
ydone
Bloquear una declaración condicional se escribe para comprobar si el año es un año bisiesto o no.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else echo "$YEAR = not a leap year" fi done
Ejemplo 6: uso de la declaración Break, Continue
Hay dos palabras clave de bash integradas que se utilizan para controlar el flujo de sus bucles.
- Rotura – Sale del bucle y omite cualquier iteración pendiente.
- Sigue adelante – Omita la iteración actual y devuelva el control al bucle for para ejecutar la siguiente iteración.
Para comprobar si están integrados en Bash o no, utilice type
Mando:
$ type break continue break is a shell builtin continue is a shell builtin
Veamos brevemente cómo y dónde se pueden usar tanto la pausa como la continuación.
Estoy usando el mismo código que usé en la sección anterior para encontrar el año bisiesto. En este caso, solo necesito el primer año bisiesto entre 2010 y 2020. Si se encuentra ese año, mi ciclo puede terminar.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" break else echo "$YEAR = not a leap year" fi done
De la salida anterior, puede ver for loop
iterado, y si se encuentra el primer año bisiesto 2012, break
-Se lee la instrucción, se sale del bucle y se devuelve el control al terminal.
Ahora estoy cambiando el mismo código para eso. "continue"
Opinión. los continue
Sentencia, si se interpreta, omite la iteración actual, es decir, el código que viene después de la sentencia continue, y le devuelve el control. for loop
para ejecutar la siguiente iteración.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else continue echo "$YEAR = not a leap year" fi done
En la imagen de arriba, puede ver que hay una declaración de eco que la declaración de continuación omite.
Ejemplo 7: uso de declaraciones verdaderas
Al crear bucles o declaraciones condicionales, no puede dejar el bloque de código en blanco. Bash arroja un error de sintaxis.
Eche un vistazo a las dos imágenes de arriba. En la primera imagen tengo un. creado for loop
pero no hay comandos en el medio do
y done
. De manera similar, en la segunda imagen, dejé la cláusula else vacía. En cualquier caso, bash no acepta bloques vacíos y arroja errores de sintaxis.
Puedes usar bash incorporado “true"
Palabra clave que siempre establece el código de salida en (Éxito).
$ type true true is a shell builtin
De esta manera, deja el bloque de código vacío sin arrojar los errores de bash.
diploma
En este tutorial de Bash-for-Loop, comenzamos con la introducción a los bucles y la sintaxis de. comenzó for loop
junto con el estilo C. También vimos cómo usar bucles for junto con las instrucciones de control de bucle break y continue en diversas condiciones. Lo veremos en nuestra próxima guía. While
y Until
Bucles con ejemplos.