Hoy hablaremos sobre scripts de bash. Esto es — , escritos para el intérprete de comandos bash. Existen otros intérpretes, como — zsh, tcsh, ksh, pero nos centraremos en bash. Este material está dirigido a todos los interesados, la única condición es saber trabajar en de Linux.
Los scripts de línea de comandos son conjuntos de los mismos comandos que se pueden ingresar desde el teclado, reunidos en archivos y unidos por un propósito común. Los resultados del trabajo de los comandos pueden tener un valor independiente o servir como entrada para otros comandos. Los scripts son una forma poderosa de automatizar acciones que se realizan con frecuencia.
Así que, hablando de la línea de comandos, permite ejecutar varios comandos a la vez, ingresándolos a través de un punto y coma:
pwd ; whoami De hecho, si has probado esto en tu terminal, ya has escrito tu primer script de bash, que involucra dos comandos. Funciona de esta manera. Primero, el comando pwd muestra en pantalla información sobre el directorio de trabajo actual, luego el comando whoamimuestra información sobre el usuario con el que has iniciado sesión.
Usando un enfoque similar, puedes combinar tantas órdenes como desees en una sola línea; la única limitación es la cantidad máxima de argumentos que se pueden pasar a un programa. Puedes determinar esta limitación usando el siguiente comando:
getconf ARG_MAXLa línea de comandos es una excelente herramienta, pero hay que ingresar los comandos cada vez que se necesitan. ¿Qué pasaría si se grabara un conjunto de comandos en un archivo y simplemente se llamara a ese archivo para ejecutarlos? En realidad, el archivo del que hablamos se llama un script de línea de comandos.
Cómo funcionan los scripts de bash
Crea un archivo vacío usando el comando touch. En su primera línea, es necesario especificar qué intérprete vamos a utilizar. Nos interesa bash, por lo que la primera línea del archivo será así:
#!/bin/bash En las otras líneas de este archivo, el símbolo de almohadilla se utiliza para denotar comentarios que el intérprete no procesa. Sin embargo, la primera línea es un caso especial; aquí la almohadilla, seguida de un signo de exclamación (a esta secuencia se le llama ) y la ruta a bash, indican al sistema que el script ha sido creado específicamente para bash.
Las órdenes del intérprete se separan mediante un salto de línea, los comentarios se destacan con el símbolo de almohadilla. Así es como se ve:
#!/bin/bash
# This is a comment
pwd
whoamiAquí, al igual que en la línea de comandos, se pueden ingresar órdenes en una sola línea, separándolas con un punto y coma. Sin embargo, escribir órdenes en diferentes líneas hace que el archivo sea más fácil de leer. En cualquier caso, el intérprete las procesará.
Estableciendo permisos para el archivo del script
Guarde el archivo, dándole el nombre myscript, y el trabajo de crear el script bash estará casi completo. Ahora solo queda hacer que este archivo sea ejecutable; de lo contrario, al intentar ejecutarlo te encontrarás con el error Permission denied.

Intento de ejecutar el archivo del script con permisos configurados incorrectamente
Hagamos que el archivo sea ejecutable:
chmod +x ./myscriptAhora intentemos ejecutarlo:
./myscriptDespués de configurar los permisos, todo funciona como se espera.

Ejecución exitosa del script bash
Salida de mensajes
Para imprimir texto en la consola de Linux, se utiliza el comando echo. Aprovechemos este conocimiento y editemos nuestro script, añadiendo explicaciones a los datos que las órdenes existentes ya imprimen:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiEsto es lo que obtendremos después de ejecutar el script actualizado.

Salida de mensajes desde el script
Ahora podemos imprimir etiquetas explicativas utilizando el comando echo. Si no sabes cómo editar un archivo usando herramientas de Linux, o si nunca has encontrado el comando echo, echa un vistazo a material.
Uso de variables
Las variables permiten almacenar información en el archivo del script, por ejemplo, los resultados de las órdenes para utilizarlos en otras órdenes.
No hay nada de malo en ejecutar órdenes individuales sin almacenar los resultados, pero las posibilidades de este enfoque son bastante limitadas.
Existen dos tipos de variables que se pueden utilizar en scripts bash:
- Variables de entorno
- Variables Personalizadas
Variables de entorno
A veces es necesario trabajar con ciertos datos del sistema en los comandos de la shell. Por ejemplo, aquí hay una forma de mostrar el directorio personal del usuario actual:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Ten en cuenta que podemos utilizar la variable del sistema $HOME entre comillas dobles, lo que no impedirá que el sistema la reconozca. Esto es lo que obtendrás si ejecutas el script anterior.

Uso de una variable de entorno en un script
¿Y si necesitamos mostrar el símbolo del dólar en la pantalla? Intentémoslo así:
echo "Tengo $1 en mi bolsillo" El sistema detectará el signo de dólar en la cadena entre comillas y asumirá que estamos haciendo referencia a una variable. El script intentará mostrar el valor de una variable no definida $1. Esto no es lo que necesitamos. ¿Qué hacer?
En tal situación, el uso del carácter de escape, la barra invertida, antes del signo de dólar será de ayuda:
echo "Tengo $1 en mi bolsillo"Ahora el script mostrará exactamente lo que se espera.

Uso de una secuencia de control para mostrar el signo del dólar
Variables Personalizadas
Además de las variables de entorno, los scripts de bash permiten definir y utilizar variables personalizadas en el script. Estas variables almacenan su valor hasta que finaliza la ejecución del script.
Al igual que con las variables del sistema, se pueden referir a las variables personalizadas utilizando el signo de dólar:
TNW-CUS-FMP — código promocional de un 10% de descuento en nuestros servicios, disponible para activar durante 7 días
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Esto es lo que obtendrás después de ejecutar dicho script.

Variables personalizadas en el script
Sustitución de comandos
Una de las características más útiles de los scripts de bash es la capacidad de extraer información de la salida de los comandos y asignarla a variables, lo que permite utilizar esta información en cualquier parte del archivo del script.
Esto se puede hacer de dos maneras.
- Usando el carácter de apóstrofo inverso «`»
- Usando la construcción
$()
Al utilizar el primer enfoque, asegúrate de no introducir una comilla simple en lugar del apóstrofo inverso. El comando debe estar encerrado entre dos de estos caracteres:
mydir=`pwd`En el segundo enfoque, se escribe lo mismo así:
mydir=$(pwd)Y el script, al final, puede verse así:
#!/bin/bash
mydir=$(pwd)
echo $mydir Durante su ejecución, la salida del comando pwdse guardará en la variable mydir, cuyo contenido, usando el comando echo, aparecerá en la consola.

Un script que guarda los resultados de la ejecución de un comando en una variable
Operaciones matemáticas
Para realizar operaciones matemáticas en un archivo de script, se puede utilizar una construcción del tipo $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Operaciones matemáticas en el script
Construcción de control if-then
En algunos scripts es necesario controlar el flujo de ejecución de los comandos. Por ejemplo, si un valor es mayor que cinco, se necesita hacer una acción, de lo contrario, otra. Esto es aplicable en muchas situaciones, y aquí nos ayudará la construcción de control if-then. En su forma más simple, se ve así:
if comando
then
comandos
fiAquí hay un ejemplo funcional:
#!/bin/bash
if pwd
then
echo "It works"
fi En este caso, si la ejecución del comando pwdfinaliza exitosamente, se mostrará en la consola el texto «it works».
Vamos a utilizar nuestro conocimiento y escribir un script más complejo. Supongamos que necesitamos encontrar a un usuario en /etc/passwd, y si logramos encontrarlo, informar que existe.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiAsí es como se ve después de ejecutar este script.

Búsqueda de usuario
Aquí utilizamos el comando greppara buscar al usuario en el archivo /etc/passwd. Si el comando grepno te es familiar, su descripción se puede encontrar .
En este ejemplo, si se encuentra al usuario, el script mostrará un mensaje correspondiente. ¿Y si no se logró encontrar al usuario? En este caso, el script simplemente finalizará su ejecución sin decir nada, y nos gustaría que también informara de esto, así que mejoraremos el código.
Construcción de control if-then-else
Para que el programa pueda informar tanto sobre los resultados de una búsqueda exitosa como sobre un fracaso, utilizaremos la construcción if-then-else. Así es como funciona:
if comando
then
comandos
else
comandos
fi Si el primer comando devuelve cero, lo que significa que se ejecutó con éxito, la condición se considerará verdadera y la ejecución no seguirá por la rama else. En caso contrario, si se devuelve algo diferente de cero, lo que indicaría un fracaso o un resultado falso, se ejecutarán los comandos ubicados después de else.
Escribamos un script así:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Su ejecución ha seguido la rama else.

Ejecutando el script con la construcción if-then-else
Bien, seguimos avanzando y nos planteamos la cuestión de condiciones más complejas. ¿Qué pasa si es necesario verificar no una, sino varias condiciones? Por ejemplo, si se encuentra al usuario deseado, debemos mostrar un mensaje, si se cumple alguna otra condición — otro mensaje, y así sucesivamente. En tal situación, nos ayudarán las condiciones anidadas. Se ve así:
if comando1
then
comandos
elif comando2
then
comandos
fi Si el primer comando devuelve cero, lo que indica que se ha ejecutado con éxito, se ejecutarán los comandos en el primer bloque. then, de lo contrario, si la primera condición resulta falsa, y si el segundo comando devuelve cero, se ejecutará el segundo bloque de código.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi En un script así, por ejemplo, se puede crear un nuevo usuario con el comando useradd, si la búsqueda no dio resultados, o hacer algo más útil.
Comparación de números
En los scripts se pueden comparar valores numéricos. A continuación se presenta una lista de comandos correspondientes.
n1 -eq n2Devuelve verdadero sin1es igual an2.
n1 -ge n2Devuelve verdadero sin1mayor o igual quen2.
n1 -gt n2Devuelve verdadero sin1mayor quen2.
n1 -le n2Devuelve verdadero sin1menor o igual quen2.
n1 -lt n2Devuelve verdadero si n1 es menor quen2.
n1 -ne n2Devuelve verdadero sin1no es igualn2.
Como ejemplo, probemos uno de los operadores de comparación. Tenga en cuenta que la expresión está entre corchetes.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiEsto es lo que devolverá este comando.

Comparación de números en scripts
El valor de la variable val1es mayor que 5, por lo que se ejecuta la rama thendel operador de comparación y se muestra el mensaje correspondiente en la consola.
Comparación de cadenas
En los scripts también se pueden comparar valores de cadena. Los operadores de comparación son bastante sencillos, sin embargo, hay ciertas particularidades en las operaciones de comparación de cadenas que abordaremos a continuación. Aquí hay una lista de operadores.
str1 = str2Compara las cadenas por igualdad, devuelve verdadero si las cadenas son idénticas.
str1 != str2Devuelve verdadero si las cadenas no son idénticas.
str1 < str2Devuelve verdadero sistr1es menor questr2.
str1 > str2Devuelve verdadero sistr1mayor questr2.
-n str1Devuelve verdadero si la longitudstr1es mayor que cero.
-z str1Devuelve verdadero si la longitudstr1es igual a cero.
Aquí hay un ejemplo de comparación de cadenas en un script:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiComo resultado de la ejecución del script, obtendremos lo siguiente.

Comparación de cadenas en scripts
Una característica del comparador de cadenas que vale la pena mencionar es que los operadores ">" y "" como un comando de redirección de salida.
Así es como se ve el trabajo con estos operadores en el código:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiEstos son los resultados de la ejecución del script.

Comparación de cadenas, advertencia mostrada
Tenga en cuenta que el script, aunque se ejecuta, muestra una advertencia:
./myscript: line 5: [: demasiado argumentos Para deshacerse de esta advertencia, pongamos $val2 entre comillas dobles:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiAhora todo funciona como se espera.

Comparación de cadenas
Otra característica de los operadores ">" y "<" es cómo funcionan con letras en mayúsculas y minúsculas. Para entender esta característica, preparemos un archivo de texto con el siguiente contenido:
Likegeeks
likegeeks Lo guardaremos con el nombre myfile, después de lo cual ejecutaremos el siguiente comando en la terminal:
sort myfileOrdenará las líneas del archivo de la siguiente manera:
likegeeks
Likegeeks Comando sort, por defecto, ordena las cadenas en orden ascendente, es decir, la letra minúscula en nuestro ejemplo es menor que la mayúscula. Ahora preparemos un script que comparará las mismas cadenas:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiAl ejecutarlo, resultará que todo es al revés: la letra minúscula ahora es mayor que la mayúscula.

El comando sort y la comparación de cadenas en el script
En los comandos de comparación, las letras mayúsculas son menores que las minúsculas. La comparación de cadenas aquí se realiza comparando los códigos ASCII de los caracteres, por lo que el orden de clasificación depende de los códigos de los caracteres.
Comando sort, a su vez, utiliza el orden de clasificación definido en la configuración de idioma del sistema.
Comprobaciones de archivos
Probablemente, los siguientes comandos se utilizan con más frecuencia en scripts bash. Permiten verificar diferentes condiciones relacionadas con los archivos. Aquí hay una lista de estos comandos.
-d fileVerifica si el archivo existe y si es un directorio.
-e fileVerifica si el archivo existe.
-f fileVerifica si el archivo existe y si es un archivo.
-r fileVerifica si el archivo existe y si es accesible para lectura.
-s fileVerifica si el archivo existe y si no está vacío.
-w fileVerifica si el archivo existe y si es accesible para escritura.
-x fileVerifica si el archivo existe y si es ejecutable.
file1 -nt file2Verifica si es más nuevo quefile1, quefile2.
file1 -ot file2Verifica si es más viejo quefile1, quefile2.
-O fileVerifica si el archivo existe y si es propietario el usuario actual.
-G fileVerifica si el archivo existe y si su identificador de grupo coincide con el del grupo del usuario actual.
Estos comandos, al igual que muchos otros que hemos revisado hoy, son fáciles de recordar. Sus nombres, siendo abreviaciones de diversas palabras, indican directamente las verificaciones que realizan.
Probemos uno de los comandos en práctica:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiEste script, para un directorio existente, mostrará su contenido.

Salida del contenido del directorio
Suponemos que con los demás comandos podrás experimentar por tu cuenta, todos se aplican bajo el mismo principio.
Resultados
Hoy hemos hablado sobre cómo comenzar a escribir scripts en bash y hemos revisado algunas cosas básicas. En realidad, el tema de programación en bash es enorme. Este artículo es una traducción de la primera parte de una gran serie de 11 materiales. Si deseas la continuación ahora mismo, aquí está la lista de los originales de estos materiales. Para tu comodidad, también se incluye el que acabas de leer.
- — aquí se trata de cómo iniciar la creación de scripts en bash, se revisa el uso de variables, se describen las estructuras condicionales, los cálculos, las comparaciones de números y cadenas, la obtención de información sobre los archivos.
- — aquí se abordan las características del trabajo con los bucles for y while.
- — este material está dedicado a los parámetros de la línea de comandos y las claves que se pueden pasar a los scripts, al trabajo con los datos que ingresa el usuario y que se pueden leer desde archivos.
- — aquí se habla sobre descriptores de archivos y su uso, sobre flujos de entrada, salida, errores y la redirección de salida.
- — este material está dedicado a las señales en Linux, su manejo en scripts, y la ejecución de scripts programados.
- — aquí puedes aprender sobre la creación y uso de funciones en scripts, sobre el desarrollo de bibliotecas.
- — este artículo está dedicado al uso del editor de texto por flujo sed.
- — este material se centra en la programación en el lenguaje de procesamiento de datos awk.
- — aquí se puede leer sobre el uso de expresiones regulares en scripts de bash.
- — aquí se presentan técnicas para trabajar con mensajes que se pueden enviar a los usuarios, así como metodologías para monitorear discos.
- — este material se dedica a la herramienta Expect, que permite automatizar la interacción con utilidades interactivas. En particular, se habla sobre scripts de expect y su interacción con scripts de bash y otros programas.
Consideramos que una de las propiedades valiosas de esta serie de artículos es que, comenzando desde lo más simple, adecuado para usuarios de cualquier nivel, gradualmente avanza hacia temas bastante complejos, dando la oportunidad a todos los interesados de avanzar en la creación de scripts de línea de comandos de Linux.
¡Estimados lectores! Pedimos a los gurus de la programación en bash que cuenten cómo alcanzaron las cimas de su maestría y que compartan sus secretos, y de aquellos que acaban de escribir su primer script, esperamos sus impresiones.
Solo los usuarios registrados pueden participar en la encuesta. , por favor.
¿Traducir las otras partes del ciclo de artículos?
¡Sí!
No, no es necesario
Votaron 1030 usuarios. Se abstuvieron 106 usuarios.
Fuente: habr.com
