Fundamentos y Herramientas Esenciales de Bash Scripting

Intérpretes de comandos en sistemas Unix-like

Un script de shell es un archivo de texto que contiene una serie de comandos que son ejecutados por un intérprete. En la mayoría de las distribuciones de Linux, existen diversos intérpretes disponibles.

Para identificar los intérpretes instalados en el sistema, se puede consultar el archivo /etc/shells:

$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/zsh

Si se desea conocer cuál es el intérprete predeterminado del entorno actual, se utiliza la variable de entorno $SHELL:

$ echo $SHELL
/bin/bash

Creación y ejecución de scripts básicos

Todo script de Bash debe comenzar con una línea denominada "shebang" (#!), que indica al sistema qué intérprete debe utilizar para procesar el archivo.

#!/bin/bash
# Ejemplo: imprimir un mensaje y generar un archivo
echo "Iniciando proceso..."
printf "Contenido de prueba\n" > bitacora.txt
echo "Datos añadidos correctamente" >> bitacora.txt

El operador > sobrescribe el archivo, mientras que >> concatena el contenido al final del mismo.

Gestión de Variables

Variables del Sistema

El entorno proporciona variables globales predefinidas, tales como:

  • $HOME: Ruta del directorio personal del usuario.
  • $PWD: Directorio de trabajo actual.
  • $USER: Nombre del usuario que ejecuta la sesión.

Variables de Usuario

Al definir variables personalizadas, es fundamental no dejar espacios alrededor del signo igual (=).

# Definición y uso
nombre="Servidor_Web"
echo $nombre

# Declaración de constantes (solo lectura)
readonly PUERTO=8080

# Eliminar una variable de la memoria
unset nombre

Variables Especiales de Argumentos

Bash utiliza variables específicas para gestionar los parámetros pasados al script desde la línea de comandos:

  • $0: Nombre del script.
  • $1 al $9: Argumentos posicionales del primero al noveno.
  • ${10}: Argumentos a partir del décimo (requieren llaves).
  • $#: Cantidad total de parámetros suministrados.
  • $*: Representa todos los parámetros como una sola cadena de texto.
  • $@: Representa todos los parámetros como una lista de elementos independientes.
  • $?: Código de salida del último comando ejecutado (0 indica éxito).

Operaciones Aritméticas

Para realizar cálculos matemáticos, Bash ofrece la sintaxis $(( )) o el comando expr.

#!/bin/bash
# Uso de $(( )) para mayor legibilidad
val1=15
val2=5
suma=$((val1 + val2))
producto=$((val1 * val2))

# Uso de expr (requiere espacios y escape para el asterisco)
resta=$(expr $val1 - $val2)
division=$(expr $val1 / $val2)

echo "Suma: $suma, Producto: $producto, Resta: $resta, Div: $division"

Estructuras de Control y Condicionales

Las pruebas lógicas se encierran habitualemnte entre corchetes [ ]. Es obligatorio dejar espacios entre los cocrhetes y la expresión interna.

Comparación de valores

Existen operadores específicos para números y archivos:

# Enteros: -eq (igual), -ne (distinto), -lt (menor), -gt (mayor), -ge (mayor o igual)
if [ $val1 -gt 10 ]; then
    echo "El valor es mayor a 10"
fi

# Archivos: -e (existe), -f (es archivo regular), -d (es directorio), -w (escritura)
if [ -f "config.cfg" ]; then
    echo "El archivo de configuración existe."
fi

Estructuras de Decisión: if y case

# Estructura if-elif-else
read -p "Ingrese una opción [A/B]: " opcion
if [ "$opcion" == "A" ]; then
    echo "Seleccionó Alfa"
elif [ "$opcion" == "B" ]; then
    echo "Seleccionó Beta"
else
    echo "Opción no válida"
fi

# Estructura case (útil para menús)
case $1 in
    "start")
        echo "Iniciando servicio..."
        ;;
    "stop")
        echo "Deteniendo servicio..."
        ;;
    *)
        echo "Uso: $0 {start|stop}"
        ;;
esac

Bucles y Repeticiones

Bucle For

Existen dos formas comunes: el estilo tradicional de C y la iteración sobre listas.

# Estilo C
for ((i=1; i<=5; i++)); do
    echo "Iteración número: $i"
done

# Iteración sobre argumentos
for item in "$@"; do
    echo "Parámetro recibido: $item"
done

Bucle While

contador=1
while [ $contador -le 3 ]; do
    echo "Contando: $contador"
    contador=$((contador + 1))
done

Funciones Personalizadas

Las funciones permiten encapsular lógica reutilizable. Los parámetros se acceden mediante $1, $2, etc., de forma local a la función.

calcular_area() {
    local base=$1
    local altura=$2
    local area=$((base * altura))
    echo $area
}

resultado=$(calcular_area 10 5)
echo "El área calculada es: $resultado"

Herramientas de Procesamiento de Texto

Manipulación con cut, sed y awk

Estas herramientas son fundamentales para el filtrado de datos en tuberías (pipelines).

  • cut: Extrae columnas específicas. cut -d ':' -f 1 /etc/passwd
  • sed: Editor de flujo para reemplazar o eliminar texto. sed 's/antiguo/nuevo/g' archivo.txt
  • awk: Lenguaje de procesamiento de patrones. awk -F: '{print $1}' /etc/passwd
  • sort: Ordena líneas de texto basándose en criterios numéricos o alfabéticos.
# Ejemplo: Obtener los nombres de usuario ordenados
cat /etc/passwd | cut -d: -f1 | sort

Manipulación Avanzada de Cadenas y Expansoines

Bash permite modificar variables directamente durante su expansión mediante llaves ${}.

ruta="/var/log/nginx/access.log"

# Extraer subcadena (inicio:longitud)
echo ${ruta:0:4}  # Resultado: /var

# Reemplazo de texto
echo ${ruta/nginx/apache} # Reemplaza la primera coincidencia

# Eliminación de patrones
# # (Desde la izquierda, mínimo), ## (Desde la izquierda, máximo)
# % (Desde la derecha, mínimo), %% (Desde la derecha, máximo)
echo ${ruta##*/} # Obtiene solo el nombre del archivo: access.log
echo ${ruta%/*}  # Obtiene la ruta del directorio: /var/log/nginx

Etiquetas: bash shell-scripting linux-terminal automation command-line

Publicado el 7-1 05:53