Linux & TerminalAdministracion AvanzadaLección 11 de 12
Bash Scripting Avanzado
Bash es el lenguaje de la terminal de Linux. Un script de Bash es un archivo con comandos que se ejecutan uno tras otro, así puedes automatizar tareas repetitivas: hacer copias de seguridad, renombrar cientos de archivos, desplegar un proyecto.
Lo que usarás: variables (nombre="Ana" y luego $nombre), condicionales (if), bucles (for, while) y funciones. La primera línea, #!/bin/bash, le dice al sistema que use Bash para ejecutar el archivo. Para correrlo: chmod +x script.sh y luego ./script.sh.
#!/bin/bash
# VARIABLES Y PARAMETROS
NOMBRE="servidor-prod"
PUERTO=3000
FECHA=$(date +%Y-%m-%d) # Sustitucion de comandos
# Argumentos del script: $1, $2, ..., $# (total), $@ (todos)
echo "Script: $0"
echo "Argumento 1: $1"
echo "Total argumentos: $#"
# Valores por defecto
ENTORNO=${1:-"development"} # Si $1 esta vacio, usa "development"
LOG_DIR=${LOG_DIR:-"/var/log/mi-app"}
# ARRAYS
SERVIDORES=("web-01" "web-02" "db-01")
echo "Primer servidor: ${SERVIDORES[0]}"
echo "Todos: ${SERVIDORES[@]}"
echo "Total: ${#SERVIDORES[@]}"
# Agregar elemento
SERVIDORES+=("cache-01")
# Iterar array
for srv in "${SERVIDORES[@]}"; do
echo "Verificando $srv..."
done
#!/bin/bash
# CONDICIONALES
# if con operadores de archivo
if [ -f "/etc/nginx/nginx.conf" ]; then
echo "Nginx esta instalado"
elif [ -f "/etc/apache2/apache2.conf" ]; then
echo "Apache esta instalado"
else
echo "No hay servidor web"
fi
# Operadores de prueba:
# -f archivo existe y es archivo regular
# -d dir existe y es directorio
# -z "$var" variable esta vacia
# -n "$var" variable NO esta vacia
# -eq -ne -gt -lt -ge -le comparaciones numericas
# = != comparaciones de strings
# BUCLES
for i in {1..5}; do
echo "Intento $i de 5"
done
# While con lectura de archivo
while IFS= read -r linea; do
echo "Procesando: $linea"
done < servidores.txt
# CASE (switch)
case "$1" in
start) systemctl start mi-app ;;
stop) systemctl stop mi-app ;;
restart) systemctl restart mi-app ;;
status) systemctl status mi-app ;;
*) echo "Uso: $0 {start|stop|restart|status}" ;;
esac
#!/bin/bash
# FUNCIONES
# Funcion con retorno y parametros
log() {
local nivel="$1"
local mensaje="$2"
echo "[$(date +%H:%M:%S)] [$nivel] $mensaje"
}
verificar_servicio() {
local servicio="$1"
if systemctl is-active --quiet "$servicio"; then
log "OK" "$servicio esta corriendo"
return 0
else
log "ERROR" "$servicio esta caido!"
return 1
fi
}
# Uso
log "INFO" "Iniciando verificacion"
if verificar_servicio "nginx"; then
log "INFO" "Todo bien"
else
log "WARN" "Reiniciando nginx..."
sudo systemctl restart nginx
fi
# Capturar exit code
grep -q "error" /var/log/app.log
if [ $? -eq 0 ]; then
echo "Se encontraron errores"
fi
# read: leer input del usuario
read -p "Continuar? (s/n): " respuesta
if [ "$respuesta" = "s" ]; then
echo "Continuando..."
fi
ConsejoSiempre usa comillas dobles en variables: "$VAR" en vez de $VAR. Sin comillas, si la variable tiene espacios o esta vacia, el script puede fallar silenciosamente.
Practica esta lección
Resuelve los ejercicios del curso de Linux & Terminal en la app, gratis y con corrección automática.
Empezar a practicar