Los scripts de bash son un medio altamente eficiente de automatizar tareas, particularmente aquellas que aprovechan otros programas existentes. Esta automatización a menudo requiere la repetición de una operación similar varias veces, que es precisamente donde en bucle entra en juego.
Los administradores de sistemas Linux y Mac suelen estar familiarizados con las secuencias de comandos a través de la terminal, pero incluso los usuarios de Windows pueden entra en acción con el subsistema de Windows para Linux.
¿Necesita usar Linux sin tiempo para cambiar a una PC diferente o ejecutar una máquina virtual? ¡Ejecute Linux en Windows 10 con una terminal de shell Bash en su lugar!
Cómo funcionan los scripts de Bash
Un script bash es simplemente un archivo de texto sin formato que contiene una serie de comandos que el shell bash puede leer y ejecutar. Bash es el shell predeterminado en macOS anteriores a Catalina y en la mayoría de las distribuciones de Linux.
Si nunca antes ha trabajado con un script de shell, debe comenzar con el caso más simple. Esto le permitirá practicar conceptos clave, incluida la creación del script y su ejecución.
Primero, cree el siguiente archivo en una ubicación conveniente (idealmente, abra una terminal y navegue al directorio deseado primero):
#! / bin / bash
echo "Hola, mundo"
La primera línea le dice a todo lo que ejecute este programa cómo ejecutarlo (es decir, usando el intérprete de bash). El segundo es solo un comando como cualquier otro que pueda ingresar en la línea de comando. Guarde ese archivo como hello_world.sh, entonces:
$ chmod + x hello_world.sh
$ ./hello_world.sh
los chmod El comando en la primera línea hace que el archivo sea ejecutable, lo que significa que se puede ejecutar escribiendo su nombre, como en la segunda línea.
Si ve que las palabras "Hola, mundo" aparecen impresas en una línea en su terminal, entonces todo está funcionando como se requiere.
Cómo funcionan los bucles For
En la programación general, hay dos tipos principales de bucle for: numérico y para cada. El tipo numérico es tradicionalmente el más común, pero en el uso de bash suele ser al revés.
Los bucles for numéricos generalmente se enfocan en un solo entero que determina cuántas iteraciones se llevarán a cabo, por ejemplo:
para (i = 0; i <100; i ++) {
/ * sentencias para ejecutar repetidamente * /
}
Este es un bucle for de apariencia familiar que iterará exactamente 100 veces, a menos que i se modifique dentro del bucle, u otra declaración haga que se detenga la ejecución del bucle for.
Los bucles Foreach, por el contrario, tienden a operar en estructuras como listas o matrices, e iteran para cada elemento dentro de esa colección:
people = ["Peter", "Paul", "Mary"]
foreach (personas como persona) {
if (person == "Paul") {
...
}
}
Algunos lenguajes usan una sintaxis ligeramente diferente que cambia el orden de colección y artículo:
people = ["Peter", "Paul", "Mary"]
para (persona en personas) {
if (person == "Paul") {
...
}
}
Para en bucles
En bash, el foreach, o por en—El bucle es más común. La sintaxis básica es, simplemente:
para arg en [lista]
hacer
/ * sentencias para ejecutar repetidamente * /
/ * el valor de arg se puede obtener usando $ arg * /
hecho
Por ejemplo, para recorrer en iteración tres archivos con nombres explícitos:
para archivo en uno.c dos.c tres.c
hacer
ls "$ archivo"
hecho
Si tales archivos existen en el directorio actual, la salida de este script será:
uno.c
dos.c
tres.c
En lugar de un conjunto fijo de archivos, la lista se puede obtener mediante un patrón global (uno que incluye comodines, caracteres especiales que representan otros caracteres). En el siguiente ejemplo, el bucle for itera en todos los archivos (en el directorio actual) cuyos nombres terminan en ".xml":
para archivo en * .xml
hacer
ls -l "$ archivo"
hecho
A continuación, se muestra un resultado de ejemplo:
$ -rw-r - r-- 1 bobby staff 2436 3 de noviembre de 2019 feed.xml
$ -rw-r - r-- 1 bobby staff 6447 27 de octubre 16:24 sitemap.xml
Esto puede parecerse mucho a una forma larga de hacer:
$ ls -l * .xml
Pero hay una diferencia significativa: el bucle for ejecuta el ls programe 2 veces distintas, con un solo nombre de archivo cada vez. En el ejemplo de ls separado, el patrón global (* .xml) primero coincide con los nombres de archivo y luego los envía todos, como parámetros de línea de comandos individuales, a una instancia ls.
A continuación, se muestra un ejemplo que utiliza la WC (recuento de palabras) programa para hacer la diferencia más obvia:
$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 en total
los WC El programa cuenta el número de líneas en cada archivo por separado, luego imprime un recuento total en todos ellos. Por el contrario, si WC opera dentro de un bucle for:
para archivo en * .xml
hacer
wc -l $ archivo
hecho
Seguirá viendo el recuento de cada archivo:
44 feed.xml
231 sitemap.xml
Pero no hay un total de resumen general porque WC se ejecuta de forma aislada, cada vez que el bucle se repite.
Cuando una lista no es una lista
Hay un error muy fácil y común cuando se trata de bucles for, debido a la forma en que bash maneja los argumentos / cadenas entre comillas. Recorrer una lista de archivos debe hacerse así:
para archivo en one.c two.c
Así no:
para el archivo en "one.c two.c"
El segundo ejemplo incluye los nombres de archivo entre comillas dobles, lo que da como resultado una lista con un solo parámetro; el bucle for solo se ejecutará una vez. Este problema se puede evitar utilizando una variable en tales casos:
ARCHIVOS = "uno.c dos.c"
para archivo en $ FILES
hacer
...
hecho
Tenga en cuenta que la declaración de la variable en sí necesita incluir su valor entre comillas dobles.
Porque sin una lista
Sin nada para iterar, un bucle for opera en los argumentos de la línea de comandos que se proporcionaron al script cuando se invoca. Por ejemplo, si tiene un script llamado args.sh que contiene lo siguiente:
#! / bin / sh
para
hacer
echo $ a
hecho
Luego, ejecutar args.sh te dará lo siguiente:
$ ./args.sh uno dos tres
uno
dos
Tres
Bash reconoce este caso y trata para hacer como el equivalente de por un en $ @ hacer donde $ @ es una variable especial que representa los argumentos de la línea de comandos.
Emulación de un bucle for numérico tradicional
Los scripts Bash a menudo tratan con listas de archivos o líneas de salida de otros comandos, por lo que el tipo de bucle for in es común. Sin embargo, la operación tradicional de estilo C todavía es compatible:
para ((i = 1; i <= 5; i ++))
hacer
echo $ i
hecho
Esta es la forma clásica con tres partes en las que:
- una variable se inicializa (i = 1) cuando el bucle se encuentra por primera vez
- el ciclo continúa mientras la condición (i <= 5) sea verdadera
- cada vez alrededor del ciclo, la variable se incrementa (i ++)
Iterar entre dos valores es un requisito lo suficientemente común como para que exista una alternativa más corta y un poco menos confusa:
para yo en {1..5}
hacer
echo $ i
hecho
La expansión de la abrazadera que se lleva a cabo traduce efectivamente el bucle for anterior en:
para yo en 1 2 3 4
Control de bucle más fino con interrupción y continuación
Los bucles for más complejos a menudo necesitan una forma de salir temprano o reiniciar inmediatamente el bucle principal con el siguiente valor sucesivamente. Para hacerlo, bash toma prestadas las declaraciones break y continue que son comunes en otros lenguajes de programación. A continuación, se muestra un ejemplo que utiliza ambos para encontrar el primer archivo que tiene más de 100 caracteres:
#! / bin / bash
para archivo en *
hacer
si [! -f "$ archivo"]
entonces
echo "$ file no es un archivo"
Seguir
fi
num_chars = $ (wc -c echo $ archivo tiene "$ num_chars caracteres de longitud"
si [$ num_chars -gt 100]
entonces
echo "Encontrado $ archivo"
descanso
fi
hecho
El bucle for aquí opera en todos los archivos del directorio actual. Si el archivo no es un archivo normal (por ejemplo, si es un directorio), la instrucción continue se usa para reiniciar el ciclo con el siguiente archivo sucesivamente. Si es un archivo normal, el segundo bloque condicional determinará si contiene más de 100 caracteres. Si es así, la instrucción break se usa para dejar inmediatamente el ciclo for (y llegar al final del script).
Conclusión
Un script bash es un archivo que contiene un conjunto de instrucciones que se pueden ejecutar. Un bucle for permite que parte de un script se repita muchas veces. Con el uso de variables, comandos externos y las sentencias break y continue, los scripts bash pueden aplicar una lógica más compleja y realizar una amplia gama de tareas.
El informe sugiere que las etiquetas de privacidad de las aplicaciones de Apple pueden tener algunos problemas.
- Programación
- Linux
Bobby es un entusiasta de la tecnología que trabajó como desarrollador de software durante la mayor parte de dos décadas. Le apasionan los juegos, trabaja como editor de reseñas en Switch Player Magazine y está inmerso en todos los aspectos de la publicación en línea y el desarrollo web.
Suscríbete a nuestro boletín
¡Únase a nuestro boletín de noticias para obtener consejos técnicos, reseñas, libros electrónicos gratuitos y ofertas exclusivas!
Un paso más…!
Confirme su dirección de correo electrónico en el correo electrónico que le acabamos de enviar.