Shell Scripting con Bash: Básico
¿Qué es un Shell Script?
Un shell script es una serie de comandos organizados dentro de un archivo para automatizar tareas en sistemas Unix/Linux. En lugar de escribir comandos manualmente en la terminal (interactive mode), se pueden agrupar en un archivo y ejecutarlos como un programa (non-interactive mode).
Interactive Mode vs. Non-Interactive Mode
Un shell interactivo permite ejecutar comandos directamente en la terminal. En cambio, un shell script opera en non-interactive mode, ejecutando comandos sin la necesidad de intervención del usuario.
Ejemplo:
#!/bin/bash
cat << EOF
# Shellscripting with bash
# A shell script is a series of commands cleverly organized and put together in a file to accomplish automation
######################################
#INTERACTIVE Vs NOT INTERACTIVE SHELL#
######################################
# A shell script is a NON-INTERACTIVE way to interact with the shell.
# Typing commands directly on the terminal is an INTERACTIVE way
EOF
echo "my ps1 var is ${PS1}" # Environment Variable para definir el formato del prompt
Salida esperada:
my ps1 var is \s-\v\$
Nota: Puede imprimir vacío en un script, ya que PS1 solo se usa en modo interactivo.
Terminología Importante
Shell: Programa que procesa comandos y devuelve un resultado.
CLI (Command Line Interface): Interfaz de línea de comandos.
Terminal: Programa que permite la interacción con el shell.
TTY (TeleType Writer): Dispositivo histórico de entrada/salida que hoy en día representa una sesión de terminal.
POSIX: Conjunto de estándares para compatibilidad entre sistemas operativos, incluyendo shells de comandos.
Variables y Expansión en Bash
En Bash, las variables pueden expandirse utilizando $ y {}.
Ejemplo:
#!/bin/bash
var="value of var"
echo ${var} # Uso correcto con curly brackets
echo $var # Sin curly brackets
Salida esperada:
value of var
value of var
Ejemplo de error al expandir variables:
height=170
echo "Your height is = $heightcm" # Incorrecto: no existe 'heightcm'
Corrección usando curly brackets {}:
echo "Your height is = ${height}cm" # Correcto
Salida esperada:
Your height is = 170cm
Uso de IFS en Bash
IFS (Internal Field Separator) es la variable especial que define los caracteres usados para separar palabras en Bash.
Ejemplo sin comillas dobles:
#!/bin/bash
string="One Two Three"
for element in ${string}; do
echo ${element}
done
Salida esperada:
One
Two
Three
Ejemplo con comillas dobles:
#!/bin/bash
string="One Two Three"
for element in "${string}"; do
echo ${element}
done
Salida esperada:
One Two Three
Uso de Readonly Variables en Bash
Las variables de solo lectura no pueden ser modificadas después de su inicialización.
Ejemplo:
#!/bin/bash
readonly SERVERS="server1 server2 server3"
for server in ${SERVERS}; do
echo "${server}.domain.com"
done
Salida esperada:
server1.domain.com
server2.domain.com
server3.domain.com
Preguntas Frecuentes
¿Por qué es recomendable rodear las variables con curly braces {}?
Usar {} alrededor de una variable en Bash evita ambigüedades y asegura una correcta expansión. Ejemplo:
echo "Mi número es ${num}USD"
Sin los {}, el shell podría interpretar incorrectamente la variable y concatenarla con otros caracteres.
¿Qué significa seguir una convención de codificación?
Significa respetar reglas de estilo para escribir código limpio, mantenible y comprensible. Estas reglas incluyen nombres de variables, formato de funciones, indentación y organización del código.
¿Por qué es recomendable expandir variables usando double quotes ""?
Usar double quotes ("") impide que los valores se dividan en múltiples elementos debido a espacios o caracteres especiales. Ejemplo:
file_path="/mi carpeta/archivo.txt"
echo "$file_path" # Correcto
Sin comillas dobles:
echo $file_path # Incorrecto, se dividiría en palabras separadas
¿Qué carácter se recomienda para separar palabras en variables o funciones?
El guion bajo _ es el carácter recomendado. Ejemplo:
user_name="John Doe"
calculate_area() {
echo "Área calculada"
}
¿Qué es un non-interactive shell?
Un non-interactive shell es un entorno donde se ejecutan comandos mediante un script o redirección de entrada, sin interacción manual en la terminal.
¿Cuáles nombres de funciones son aceptables según las convenciones de codificación?
Los siguientes nombres cumplen con las convenciones:
calculate_area() {}
clone_repo() {}
El nombre SUM_NUMBERS() no es recomendable porque usa mayúsculas, lo cual suele reservarse para constantes.
El nombre my_function() tampoco es recomendable porque es demasiado genérico y no describe claramente la funcionalidad de la función.