En este artículo, exploraremos varios conceptos y comandos esenciales dentro del entorno de scripting de shell en Linux.
Variables en Shell
Las variables se utilizan para almacenar datos. La sintaxis para definir una variable es:
NOMBRE_VARIABLE="valor"
Reglas para nombrar variables:
- No debe haber espacios alrededor del signo igual (=).
- Los nombres de variables solo pueden contener letras (a-z, A-Z), números (0-9) y guiones bajos (_). El primer carácter no puede ser un número.
Para usar una variable, se antepone un signo de dólar ($) a su nombre. Las llaves {} alrededor del nombre de la variable son opcionales pero recomendables para evitar ambigüedades y seguir buenas prácticas de programación:
echo "${NOMBRE_VARIABLE}"
Separador de Comandos: Punto y Coma (;)
El punto y coma (;) permite ejecutar múltiples comandos en una sola línea. Cada comando se considera una sentencia independiente.
comando1 ; comando2 ; comando3
Comando exit y Código de Salida ($?)
El comando exit n finaliza la ejecución del script o shell actual. El argumento n es un código de salida numérico que indica el resultado de la operación. Un valor de 0 generalmente indica éxito, mientras que otros valores indican diferentes tipos de errores.
La variable especial $? contiene el código de salida del último comando ejecutado. Esto es útil para verificar si un comando o script se ejecutó correctamente.
# Ejemplo: Ejecutar un script y verificar su éxito
./script_a.sh
if [ $? -eq 0 ]; then
echo "Script A ejecutado exitosamente."
else
echo "Script A falló."
fi
Tubería (Pipe): Símbolo de Barra Vertical (|)
El símbolo de barra vertical (|) se utiliza para conectar la salida estándar de un comando con la entrada estándar de otro comando. Esto permite encadenar comandos para procesar datos de forma secuencial.
comando1 | comando2
El resultado de comando1 se convierte en la entrada para comando2.
Variable Especial $$
La variable especial $$ contiene el ID del proceso (PID) del shell actual.
echo "El PID de este shell es: $$"
Comando echo
El comando echo se utiliza para mostrar texto o el contenido de variables en la salida estándar.
# Mostrar una cadena de texto
echo "Este es un mensaje de prueba."
# Mostrar el contenido de una variable (usando $() para la sustitución de comandos)
echo "Fecha y hora actual: $(date +'%Y-%m-%d %H:%M:%S')"
También se puede usar para escribir datos en un archivo, como se muestra en el siguiente ejemplo:
echo "Información adicional" >> log.txt
Redirección de Entrada/Salida
La redirección permite modificar los flujos de entrada y salida estándar de los comandos.
> archivo: Redirige la salida estándar a un archivo. Si el archivo existe, su contenido se sobrescribe. Si no existe, se crea.>> archivo: Redirige la salida estándar a un archivo, añadiendo el contenido al final. Si el archivo no existe, se crea.
El operador > puede usarse para crear un archivo vacío o para vaciar el contenido de un archivo existente:
> archivo_vacio.txt
Dispositivo Especial /dev/null
/dev/null es un archivo especial en sistemas tipo Unix que actúa como un sumidero (un "agujero negro"). Cualquier dato escrito en él se descarta permanentemente. Es útil para:
- Eliminar la salida de un comando: Redirigir la salida a
/dev/null. - Vaciar el contenido de un archivo: Redirigir
/dev/nullal archivo.
# Descartar la salida de un comando
grep "patron" archivo.log > /dev/null
# Vaciar el contenido de un archivo
cat /dev/null > archivo_a_vaciar.txt
Descriptores de Archivo Estándar (stdin, stdout, stderr)
Los comandos en Linux suelen interactuar con tres flujos de datos predeterminados:
- Entrada estándar (
stdin): Descriptor de archivo 0. Por defecto, se lee desde el teclado. - Salida estándar (
stdout): Descriptor de archivo 1. Por defecto, se escribe en la consola. - Error estándar (
stderr): Descriptor de archivo 2. Por defecto, se escriben los mensajes de error en la consola.
Es común redirigir tanto la salida estándar como la salida de error a /dev/null para suprimir toda la información generada por un comando:
# Redirigir stdout (1) a /dev/null y stderr (2) a stdout (que es /dev/null)
ls archivo_inexistente 1> /dev/null 2>&1