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.$1al$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