Tema 5 / 10
LPIC-1 Examen 105

Shells y Scripts

Domina el entorno de shell, personaliza tu experiencia y aprende a escribir scripts para automatizar tareas en Linux.

105.1 Personalizar y usar el entorno de shell

La shell es una interfaz poderosa entre el usuario y el kernel en Linux. Personalizarla te ayuda a trabajar de forma más eficiente.

Archivos de configuración de la shell

Los archivos de configuración globales están en /etc, mientras que los locales están en el directorio personal del usuario.

  • Configuración global:
    • /etc/profile: Define variables globales como PATH o PS1 para sesiones de login.
    • /etc/profile.d/: Directorio con scripts ejecutados por /etc/profile.
    • /etc/bash.bashrc: Configuración para shells interactivos no-login. Establece variables, verifica el tamaño de la ventana, etc.
  • Configuración local:
    • ~/.bash_profile: Configura el entorno del usuario al iniciar una sesión de login.
    • ~/.bash_login: Se ejecuta si no existe .bash_profile.
    • ~/.profile: Se usa si no hay .bash_profile ni .bash_login. Verifica si el shell es bash y carga .bashrc.
    • ~/.bashrc: Similar a /etc/bash.bashrc. Almacena alias y funciones específicas del usuario.
    • ~/.bash_logout: Ejecuta tareas de limpieza al cerrar una sesión de login.
  • Ejecutar archivos:
    • . (punto): Ejecuta un archivo en el entorno actual. Ejemplo: . ~/.bashrc.
    • source: Similar al operador .. Ejemplo: source ~/.bashrc.
  • SKEL: Variable definida en /etc/adduser.conf. Apunta a un directorio plantilla para nuevos usuarios.

Variables

Las variables son nombres que contienen valores. Pueden incluir letras, números y guiones, pero no empezar por números ni contener espacios.

  • Definir y mostrar:
    • Ejemplo: distro=zorinos, verifica con echo $distro.
    • Con espacios: distro="zorin 12.4".
    • Comillas simples (literales): animal='My $lizard' → My $lizard.
    • Comillas dobles (sustitución): animal="My $lizard" → My uromastyx (si lizard=uromastyx).
  • Tipos de variables:
    • Locales: Solo en el shell actual, en minúsculas.
    • Globales (entorno): Persisten en la sesión, en mayúsculas.
  • Comandos relacionados:
    • set: Muestra todas las variables y funciones asignadas (locales y de entorno).
    • unset: Elimina una variable. Ejemplo: unset distro.
    • export: Convierte una variable local en global, haciéndola visible en subshells. Ejemplo: export VARIABLE.
    • env y printenv: Listan exclusivamente las variables de entorno. env también puede modificar el entorno al ejecutar un programa.
  • Variables especiales:
    • $$: Contiene el PID del shell actual.
    • $?: Almacena el código de salida del último comando ejecutado.
  • Variables comunes:
    • DISPLAY: Hostname y pantalla (echo $DISPLAY : :0).
    • HOME: Directorio personal (echo $HOME : /home/sysriser).
    • HOSTNAME: Nombre del equipo (echo $HOSTNAME : debian).
    • LANG: Localización (echo $LANG : es_ES.UTF-8).
    • LD_LIBRARY_PATH: Directorios para bibliotecas (echo $LD_LIBRARY_PATH : /usr/local/lib).
    • MAIL: Archivo de correo (echo $MAIL : /var/mail/sysriser).
    • PATH: Directorios para ejecutables (echo $PATH : /usr/local/bin:/usr/bin:/bin).
    • PS1: Define el prompt de bash.
    • SHELL: Ruta del shell actual (echo $SHELL : /bin/bash).
    • USER: Nombre del usuario (echo $USER : sysriser).

Alias y funciones

Los alias y funciones simplifican comandos repetitivos en el shell.

  • Alias: Sustituto de un comando. Usamos comillas si contiene parámetros o espacios.
    - Ejemplo: alias ll="ls -la".
    - Dinámico (comillas simples): alias where?='echo $PWD' (cambia con el directorio).
    - Estático (comillas dobles): alias where?="echo $PWD" (valor fijo).
    - Listar todos: alias sin parámetros.
    - Eliminar: unalias nombre.
  • Funciones: Más flexibles que los alias.
    # 1. Mediante la palabra function
    function miFuncion() {
        echo "Hola $1"
    }
    # 2. Mediante los símbolos ()
    miFuncion() {
        echo "Hola $1"
    }
                            

105.2 Personalizar y escribir scripts sencillos

Un script es una lista de comandos que un programa, como el intérprete de comandos bash, ejecuta en un orden específico. Personalizarlos te permite automatizar tareas de manera eficiente en Linux.

Estructura y ejecución del script

La primera línea, conocida como shebang (ej. #!/bin/bash), indica qué intérprete debe usarse. El archivo debe ser ejecutable con chmod +x nombre_script.sh.

  • Uso de echo: Muestra texto. Por defecto añade salto de línea, con -n lo evita.
    - Ejemplo: echo -n "Hola, "; echo "mundo" → Hola, mundo.
  • Múltiples comandos en una línea: Separador ;.
    - Ejemplo: echo "La hora es: "; date +%H:%M.
  • Comando read: Recoge datos ingresados por el usuario en una variable.
    - Ejemplo: read nombre; echo "Hola $nombre".
  • Comando seq: Genera secuencias numéricas.
    - Básico: seq 10 → 1 al 10.
    - Con incremento: seq 1 5 20 → 1, 6, 11, 16.

Variables especiales en scripts

  • $* y $@: Todos los argumentos pasados al script.
  • $#: Cantidad total de argumentos pasados.
  • $0: Nombre del script en ejecución.
  • $$: ID del proceso actual del script.
  • $?: Código de salida del último comando (0 éxito).

Expresiones aritméticas

  • expr: SUM=`expr 5 + 3`.
  • $(( )): result=$((5 * 3)).
  • Comparadores: -eq (igual), -ne (no igual), -lt (menor), -gt (mayor).

Ejecución condicional

Basada en el código de estado (0 éxito, != 0 error).

  • Operadores lógicos:
    • &&: Ejecuta derecha si izquierda es éxito.
      [ -f archivo ] && echo "Existe".
    • ||: Ejecuta derecha si izquierda falla.
  • Estructura if:
    if [ -f "/etc/passwd" ]; then
        echo "El archivo existe"
    fi
                            
  • Estructura case:
    case $1 in
        start) echo "Iniciando..." ;;
        stop) echo "Deteniendo..." ;;
        *) echo "Uso: $0 {start|stop}" ;;
    esac
                            

Pruebas ampliadas

  • Texto: = / == (igual), != (desigual), -z (vacío).
  • Número: -eq, -ne, -lt, -gt, -le, -ge.
  • Archivos: -f (archivo regular), -d (directorio).

Construcciones de bucle

  • for:
    for i in $(seq 1 5); do
        echo "Iteración $i"
    done
                            
  • while:
    counter=1
    while [ $counter -le 5 ]; do
        echo "Contador: $counter"
        counter=$((counter+1))
    done
                            
  • until:
    counter=1
    until [ $counter -gt 5 ]; do
        echo "Contador: $counter"
        counter=$((counter+1))
    done
                            

Captura de salida: fecha=$(date) almacena la salida en la variable.