Publicado el 23/04/2023 12:04:00 en Programación General.
Author: n4ch0m4n | Total de votos: 10 Vote
Introducción a Bash

Bash es un lenguaje de scripting utilizado en sistemas operativos basados en Unix/Linux. Bash es un acrónimo de "Bourne-again shell", que es una referencia al shell original desarrollado por Stephen Bourne.
Bash se utiliza principalmente para la automatización de tareas, como el procesamiento por lotes de archivos y la ejecución de secuencias de comandos complejas. Bash es también un lenguaje de programación completo, lo que significa que puede ser utilizado para desarrollar aplicaciones y scripts complejos.
Vale tener en cuenta que, si bien podemos hacer lo mismo con otros lenguajes, bash interactúa y es directamente el lenguaje del SO, por lo cual no necesita de librerías o aplicaciones de terceros para interactuar con nuestro SO y todo lo que podemos hacer en línea de comandos podés trasladarlo a un programa en bash.
Por eso es muy importante conocer los comandos básicos. Vamos con lo básico!!
Comandos Básicos
Los siguientes son algunos de los comandos básicos que nos servirán el día de mañana, tanto para interactuar con nuestro SO como para programar en bash.
Comandos de archivo
ls - Lista el contenido de un directorio
cd - Cambia el directorio actual
pwd - Muestra el directorio de trabajo actual
mkdir - Crea un nuevo directorio
touch - Crea un nuevo archivo vacío
cp - Copia un archivo de un lugar a otro
mv - Mueve un archivo de un lugar a otro
rm - Elimina un archivo o directorio
Comandos de texto
echo - Imprime un mensaje en la consola
cat - Muestra el contenido de un archivo
grep - Busca una cadena de texto en un archivo
sed - Edita el contenido de un archivo
awk - Procesa y analiza archivos de texto
sort - Ordena las líneas de un archivo
uniq - Elimina las líneas duplicadas de un archivo
Variables en Bash
Las variables son una forma de almacenar valores en Bash. Las variables en Bash se definen utilizando el signo igual (=) y se acceden utilizando el signo del dólar ($):
nombre="Mulder" edad=65 echo "Mi nombre es $nombre y tengo $edad años."
En este ejemplo, hemos definido dos variables, nombre y edad. Luego, hemos utilizado las variables dentro del comando echo utilizando el signo del dólar ($) para acceder a su valor.
Operadores en Bash
Los operadores en Bash se utilizan para realizar operaciones aritméticas y lógicas. Los siguientes son algunos de los operadores más comunes en Bash:
Operadores aritméticos
+ - Suma
- - Resta
* - Multiplicación
/ - División
% - Módulo
Operadores de comparación
-eq - Igual a
-ne - No igual a
-gt - Mayor que
-lt - Menor que
-ge - Mayor o igual a
-le - Menor o igual a
Estructuras de control en Bash
Las estructuras de control en Bash se utilizan para controlar el flujo de ejecución de un script. Las estructuras de control más comunes en Bash son las siguientes:
Condicionales
Los condicionales se utilizan para ejecutar código basado en una condición:
if else
if [ $edad -lt 18 ] then echo "Eres menor de edad" else echo "Eres mayor de edad" fi
En este ejemplo, utilizamos el condicional if para verificar si la variable edad es menor a 18. Si la condición es verdadera, se imprime el mensaje "Eres menor de edad". De lo contrario, se imprime el mensaje "Eres mayor de edad".
case
case $opcion in 1) echo "Opción 1 seleccionada" ;; 2) echo "Opción 2 seleccionada" ;; 3) echo "Opción 3 seleccionada" ;; *) echo "Opción inválida" ;; esac
En este ejemplo, utilizamos la estructura case para verificar el valor de la variable opcion. Si la variable es igual a 1, se imprime el mensaje "Opción 1 seleccionada". Si es igual a 2, se imprime el mensaje "Opción 2 seleccionada". Si es igual a 3, se imprime el mensaje "Opción 3 seleccionada". Si la variable no es igual a ninguno de estos valores, se imprime el mensaje "Opción inválida".
Bucles
Los bucles se utilizan para repetir una serie de comandos hasta que se cumpla una condición. Los bucles más comunes en Bash son los siguientes:
for
for i in {1..5} do echo "El valor de i es: $i" done
En este ejemplo, utilizamos el bucle for para repetir el comando echo cinco veces, imprimiendo el valor de la variable i en cada iteración.
while
contador=1 while [ $contador -le 5 ] do echo "El valor de contador es: $contador" contador=$((contador+1)) done
En este ejemplo, utilizamos el bucle while para repetir el comando echo mientras que la variable contador sea menor o igual a 5. En cada iteración, se imprime el valor de la variable contador y se incrementa en 1.
Funciones en Bash
Las funciones en Bash se utilizan para agrupar un conjunto de comandos y ejecutarlos como un solo comando. Las funciones en Bash se definen utilizando la siguiente sintaxis:
nombre_funcion() { # Código de la función }
Ejemplo de una función en Bash que suma dos números:
suma() { resultado=$(( $1 + $2 )) echo "El resultado de la suma es: $resultado" }
Para llamar a la función, se utiliza el nombre de la función seguido de los argumentos entre paréntesis:
suma 5 7
Ejemplos Prácticos:
Ejemplo 1: Comprobar si un archivo existe y crearlo si no existe
if [ ! -f archivo.txt ]; then touch archivo.txt echo "Se ha creado el archivo archivo.txt" else echo "El archivo archivo.txt ya existe" fi
En este ejemplo, se utiliza el condicional if y el operador de negación ! para comprobar si el archivo "archivo.txt" no existe. Si la condición es verdadera, se crea el archivo utilizando el comando touch y se imprime el mensaje "Se ha creado el archivo archivo.txt". De lo contrario, se imprime el mensaje "El archivo archivo.txt ya existe".
Ejemplo 2: Bucle for para procesar una lista de archivos
for archivo in $(ls *.txt); do echo "Procesando el archivo $archivo" cat $archivo done
En este ejemplo, se utiliza un bucle for para procesar una lista de archivos con extensión ".txt". En cada iteración, se imprime el mensaje "Procesando el archivo" seguido del nombre del archivo y se utiliza el comando cat para imprimir el contenido del archivo.
Ejemplo 3: Función para calcular el área de un triángulo
calcula_area_triangulo() { base=$1 altura=$2 area=$(( base * altura / 2 )) echo "El área del triángulo es: $area" }
calcula_area_triangulo 4 6
En este ejemplo, se define una función llamada calcula_area_triangulo que recibe dos parámetros: la base y la altura del triángulo. Dentro de la función, se calcula el área del triángulo utilizando la fórmula "base x altura / 2" y se imprime el resultado utilizando el comando echo. Finalmente, se llama a la función con los valores 4 y 6 como parámetros para calcular el área de un triángulo con base 4 y altura 6.
Ejemplo 4: Menú de opciones para realizar operaciones matemáticas
while true; do echo "Seleccione una operación:" echo "1. Suma" echo "2. Resta" echo "3. Multiplicación" echo "4. División" echo "5. Salir" read opcion case $opcion in 1) echo "Ingrese dos números para sumar:" read num1 read num2 resultado=$(( num1 + num2 )) echo "El resultado de la suma es: $resultado";; 2) echo "Ingrese dos números para restar:" read num1 read num2 resultado=$(( num1 - num2 )) echo "El resultado de la resta es: $resultado";; 3) echo "Ingrese dos números para multiplicar:" read num1 read num2 resultado=$(( num1 * num2 )) echo "El resultado de la multiplicación es: $resultado";; 4) echo "Ingrese dos números para dividir:" read num1 read num2 resultado=$(( num1 / num2 )) echo "El resultado de la división es: $resultado";; 5) echo "Saliendo del programa..." exit;; *) echo "Opción inválida, seleccione una opción del 1 al 5";; esac done
En este ejemplo, se utiliza un bucle while para mostrar un menú de opciones al usuario y realizar una operación matemática en base a la opción seleccionada. Se utiliza el comando echo para imprimir las opciones del menú y se utiliza el comando read para leer la opción seleccionada y los números para realizar la operación.
Se utiliza la estructura case para seleccionar la operación a realizar en función de la opción seleccionada por el usuario. En cada caso, se utiliza el comando read para leer los números necesarios para realizar la operación y se almacena el resultado en la variable resultado. Finalmente, se utiliza el comando echo para imprimir el resultado de la operación.
Si el usuario selecciona la opción 5, se imprime el mensaje "Saliendo del programa..." y se utiliza el comando exit para salir del bucle while.
Ejemplo 5: Script para realizar copias de seguridad de archivos
#!/bin/bash # Configuración de la ruta de origen y destino origen="/ruta/de/origen" destino="/ruta/de/destino" # Archivos a respaldar archivos="archivo1 archivo2 archivo3" # Creación de la carpeta de destino si no existe if [ ! -d $destino ]; then mkdir -p $destino fi # Copia de cada archivo de origen al destino for archivo in $archivos; do cp $origen/$archivo $destino/$archivo.bak echo "Se ha realizado una copia de seguridad del archivo $archivo" done
En este ejemplo, se presenta un script para realizar copias de seguridad de archivos utilizando el comando cp. Se utiliza la variable origen para almacenar la ruta de la carpeta de origen, la variable destino para almacenar la ruta de la carpeta de destino y la variable archivos para almacenar una lista de archivos a respaldar.
Se utiliza un condicional if y el operador -d para comprobar si la carpeta de destino existe. Si no existe, se utiliza el comando mkdir para crearla.
Se utiliza un bucle for para recorrer la lista de archivos a respaldar y se utiliza el comando cp para copiar cada archivo desde la carpeta de origen hacia la carpeta de destino, añadiendo la extensión .bak al final del nombre del archivo de respaldo.
Finalmente, se utiliza el comando echo para imprimir un mensaje indicando que se ha realizado una copia de seguridad del archivo correspondiente.
Ejemplo 6: Script para realizar una copia de seguridad de una base de datos MySQL
#!/bin/bash # Configuración de la base de datos usuario="usuario" password="password" host="localhost" base_de_datos="base_de_datos" # Configuración de la ruta de destino destino="/ruta/de/destino" # Nombre del archivo de respaldo fecha=$(date +"%Y-%m-%d_%H-%M-%S") archivo="$destino/$base_de_datos_$fecha.sql" # Comando para realizar el respaldo mysqldump -u $usuario -p$password -h $host $base_de_datos > $archivo # Comprobación del resultado del comando if [ $? -eq 0 ]; then echo "Se ha realizado una copia de seguridad de la base de datos $base_de_datos en el archivo $archivo" else echo "Se ha producido un error al realizar la copia de seguridad" fi
En este ejemplo, se presenta un script para realizar una copia de seguridad de una base de datos MySQL utilizando el comando mysqldump. Se utiliza la variable usuario para almacenar el nombre de usuario de la base de datos, la variable password para almacenar la contraseña del usuario, la variable host para almacenar el nombre del host de la base de datos y la variable base_de_datos para almacenar el nombre de la base de datos a respaldar.
Se utiliza la variable destino para almacenar la ruta de la carpeta de destino para el archivo de respaldo, y se utiliza la variable fecha para almacenar la fecha y hora actual en formato YYYY-MM-DD_HH-MM-SS.
Se utiliza la variable archivo para almacenar el nombre completo y la ruta del archivo de respaldo, utilizando el nombre de la base de datos y la fecha y hora actual en el nombre del archivo.
Se utiliza el comando mysqldump para realizar la copia de seguridad de la base de datos especificada, utilizando las opciones -u para especificar el nombre de usuario, -p para solicitar la contraseña del usuario, -h para especificar el nombre del host y el nombre de la base de datos para realizar el respaldo. El resultado de la operación se redirige hacia el archivo de destino especificado.
Se utiliza un condicional if y el operador -eq para comprobar el resultado del comando mysqldump. Si el resultado es igual a 0, se imprime un mensaje indicando que se ha realizado una copia de seguridad de la base de datos en el archivo correspondiente. Si el resultado es diferente de 0, se imprime un mensaje indicando que se ha producido un error al realizar la copia de seguridad.
Ejemplo 7: Script para descargar un archivo utilizando curl
#!/bin/bash # URL del archivo a descargar url="https://example.com/archivo.zip" # Ruta de destino del archivo destino="/ruta/de/destino" # Descarga del archivo utilizando curl curl -L $url -o $destino/archivo.zip # Comprobación del resultado del comando if [ $? -eq 0 ]; then echo "Se ha descargado el archivo correctamente en $destino/archivo.zip" else echo "Se ha producido un error al descargar el archivo" fi
En este ejemplo, se presenta un script para descargar un archivo desde una URL utilizando el comando curl. Se utiliza la variable url para almacenar la dirección URL del archivo a descargar, y la variable destino para almacenar la ruta de destino del archivo.
Se utiliza el comando curl para descargar el archivo desde la URL especificada, utilizando las opciones -L para seguir redirecciones en caso de que se produzcan, y -o para especificar la ruta y el nombre del archivo de destino. El resultado de la operación se redirige hacia el archivo de destino especificado.
Se utiliza un condicional if y el operador -eq para comprobar el resultado del comando curl. Si el resultado es igual a 0, se imprime un mensaje indicando que se ha descargado el archivo correctamente en la ruta de destino especificada. Si el resultado es diferente de 0, se imprime un mensaje indicando que se ha producido un error al descargar el archivo.
Ejemplo 8: Script para eliminar archivos antiguos
#!/bin/bash # Ruta de la carpeta de destino carpeta="/ruta/de/destino" # Número de días para considerar un archivo como antiguo dias_antiguos=30 # Eliminación de archivos antiguos utilizando el comando find find $carpeta -type f -mtime +$dias_antiguos -exec rm {} ; # Comprobación del resultado del comando if [ $? -eq 0 ]; then echo "Se han eliminado los archivos antiguos correctamente de $carpeta" else echo "Se ha producido un error al eliminar los archivos antiguos" fi
En este ejemplo, se presenta un script para eliminar archivos antiguos de una carpeta utilizando el comando find. Se utiliza la variable carpeta para almacenar la ruta de la carpeta de destino, y la variable dias_antiguos para especificar el número de días que se consideran como antiguo para un archivo.
Se utiliza el comando find para buscar y seleccionar los archivos que tienen una fecha de modificación más antigua que el número de días especificado utilizando las opciones -type f para seleccionar solo los archivos regulares y -mtime +$dias_antiguos para especificar la cantidad de días más antiguos que deben ser seleccionados. El comando rm se utiliza para eliminar cada archivo seleccionado.
Se utiliza un condicional if y el operador -eq para comprobar el resultado del comando find. Si el resultado es igual a 0, se imprime un mensaje indicando que se han eliminado los archivos antiguos correctamente de la carpeta especificada. Si el resultado es diferente de 0, se imprime un mensaje indicando que se ha producido un error al eliminar los archivos antiguos.
Ejemplo 9:
#!/bin/bash # Ruta de la carpeta donde se realizará la búsqueda carpeta="/ruta/de/destino" # Cadena de texto a buscar cadena="ejemplo" # Búsqueda de archivos que contienen la cadena de texto utilizando el comando grep resultados=$(grep -rl "$cadena" $carpeta) # Comprobación del resultado del comando if [ $? -eq 0 ]; then echo "Los siguientes archivos contienen la cadena de texto $cadena:" echo "$resultados" else echo "No se han encontrado archivos que contengan la cadena de texto $cadena" fi
En este ejemplo, se presenta un script para buscar archivos que contienen una cadena de texto específica en una carpeta utilizando el comando grep. Se utiliza la variable carpeta para almacenar la ruta de la carpeta donde se realizará la búsqueda, y la variable cadena para especificar la cadena de texto a buscar.
Se utiliza el comando grep para buscar archivos que contienen la cadena de texto especificada utilizando las opciones -r para realizar una búsqueda recursiva en la carpeta y sus subdirectorios, y -l para imprimir solo los nombres de los archivos que contienen la cadena de texto. El resultado de la búsqueda se almacena en la variable resultados.
Se utiliza un condicional if y el operador -eq para comprobar el resultado del comando grep. Si el resultado es igual a 0, se imprime un mensaje indicando que se han encontrado archivos que contienen la cadena de texto especificada, junto con una lista de los nombres de los archivos encontrados. Si el resultado es diferente de 0, se imprime un mensaje indicando que no se han encontrado archivos que contengan la cadena de texto especificada.
Fuentes de información
La información utilizada para crear esta guía fue obtenida de diferentes fuentes de información como por ejemplo:
Documentación oficial de Bash: https://www.gnu.org/software/bash/
Documentación de Bash en Linuxize: https://linuxize.com/tags/bash/
Tutorial de Bash en TutorialsPoint: https://www.tutorialspoint.com/unix/shell_script
YAPA:
Web con ejemplos interesante de comandos en bash y lo potente que puede ser: https://www.commandlinefu.com/
$ cat $(echo -e "x2fx65x74x63x2fx70x61x73x73x77x64")