Scripts de Bash: Inicio

Scripts de Bash: Inicio
Scripts de Bash, parte 2: Bucles
Scripts de Bash, parte 3: Parámetros y claves de la línea de comandos
Scripts de Bash, parte 4: Entrada y salida
Scripts de Bash, parte 5: Señales, tareas en segundo plano, gestión de scripts
Scripts de Bash, parte 6: Funciones y desarrollo de bibliotecas
Scripts de Bash, parte 7: sed y procesamiento de textos
Scripts de Bash, parte 8: Lenguaje de procesamiento de datos awk
Scripts de Bash, parte 9: Expresiones regulares
Scripts de Bash, parte 10: Ejemplos prácticos
Scripts de Bash, parte 11: expect y automatización de utilidades interactivas

Hoy hablaremos sobre scripts de bash. Esto es — scripts de línea de comandos, 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 la línea de comandos de Linux.

Scripts de Bash: Inicio

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.

Scripts de Bash: Inicio

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_MAX

La 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 shebang) 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
whoami

Aquí, 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.

Scripts de Bash: Inicio
Intento de ejecutar el archivo del script con permisos configurados incorrectamente

Hagamos que el archivo sea ejecutable:

chmod +x ./myscript

Ahora intentemos ejecutarlo:

./myscript

Después de configurar los permisos, todo funciona como se espera.

Scripts de Bash: Inicio
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:"
whoami

Esto es lo que obtendremos después de ejecutar el script actualizado.

Scripts de Bash: Inicio
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 este 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.

Scripts de Bash: Inicio
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.

Scripts de Bash: Inicio
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.

Scripts de Bash: Inicio
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.

Scripts de Bash: Inicio
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

Scripts de Bash: Inicio
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
fi

Aquí 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"
fi

Así es como se ve después de ejecutar este script.

Scripts de Bash: Inicio
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 aquí.

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.

Scripts de Bash: Inicio
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 si n1 es igual a n2.
n1 -ge n2 Devuelve verdadero si n1mayor o igual que n2.
n1 -gt n2Devuelve verdadero si n1 mayor que n2.
n1 -le n2Devuelve verdadero si n1menor o igual que n2.
n1 -lt n2Devuelve verdadero si n1 es menor que n2.
n1 -ne n2Devuelve verdadero si n1no es igual n2.

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"
fi

Esto es lo que devolverá este comando.

Scripts de Bash: Inicio
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 = str2 Compara 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 si str1es menor que str2.
str1 > str2 Devuelve verdadero si str1mayor que str2.
-n str1 Devuelve verdadero si la longitud str1es mayor que cero.
-z str1Devuelve verdadero si la longitud str1es 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"
fi

Como resultado de la ejecución del script, obtendremos lo siguiente.

Scripts de Bash: Inicio
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"
fi

Estos son los resultados de la ejecución del script.

Scripts de Bash: Inicio
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"
fi

Ahora todo funciona como se espera.

Scripts de Bash: Inicio
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 myfile

Ordenará 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"
fi

Al ejecutarlo, resultará que todo es al revés: la letra minúscula ahora es mayor que la mayúscula.

Scripts de Bash: Inicio
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 file Verifica 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 file2 Verifica si es más nuevo que file1, que file2.
file1 -ot file2Verifica si es más viejo que file1, que file2.
-O file Verifica 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"
fi

Este script, para un directorio existente, mostrará su contenido.

Scripts de Bash: Inicio
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.

  1. Bash Script Paso a Paso — 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.
  2. Parte 2 de la Programación en Bash, Bash el impresionante — aquí se abordan las características del trabajo con los bucles for y while.
  3. Parte 3 de la Programación en Bash, Parámetros y opciones — 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.
  4. Parte 4 de la Programación en Bash, Entrada y Salida — aquí se habla sobre descriptores de archivos y su uso, sobre flujos de entrada, salida, errores y la redirección de salida.
  5. Parte 5 de la Programación en Bash, Señales y Trabajos — este material está dedicado a las señales en Linux, su manejo en scripts, y la ejecución de scripts programados.
  6. Parte 6 de la Programación en Bash, Funciones — aquí puedes aprender sobre la creación y uso de funciones en scripts, sobre el desarrollo de bibliotecas.
  7. Parte 7 de la Programación en Bash, Usando sed — este artículo está dedicado al uso del editor de texto por flujo sed.
  8. Parte 8 de la Programación en Bash, Usando awk — este material se centra en la programación en el lenguaje de procesamiento de datos awk.
  9. Parte 9 de la Programación en Bash, Expresiones Regulares — aquí se puede leer sobre el uso de expresiones regulares en scripts de bash.
  10. Scripting Bash Parte 10, Ejemplos Prácticos — aquí se presentan técnicas para trabajar con mensajes que se pueden enviar a los usuarios, así como metodologías para monitorear discos.
  11. Scripting Bash Parte 11, Comando Expect — 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.

Scripts de Bash: Inicio

Solo los usuarios registrados pueden participar en la encuesta. Inicie sesión, 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

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster