Shell Script
Un shell script es un archivo de texto con comandos que se ejecutan en la terminal de Unix/Linux/macOS.
Para crear un script, normalmente usamos un editor de texto y guardamos el archivo con extensión .sh.
Debemos indicar al principio del archivo qué intérprete usar:
1. #!/bin/bash——- Esto indica que se usará Bash.
Ejemplo básico:
#!/bin/bash
echo "Hola, mundo"
Para ejecutar el script:
chmod +x mi_script.sh # Esto le da permiso de ejecución
./mi_script.sh # Ejecuta el script
Variables y asignación
Las variables se crean sin espacios alrededor del =.
No hace falta declarar el tipo, Bash lo interpreta automáticamente como texto o número según el contexto.
#!/bin/bash
nombre="Barbara" # Variable de texto
edad=25 # Variable numérica (entero)
echo "Hola, $nombre. Tienes $edad años."
Comando echo
echo sirve para imprimir mensajes en la terminal:
echo "Esto es un mensaje"
También puedes combinar texto y variables:
nombre="Barbara"
echo "Hola, $nombre"
Si quieres evitar que echo haga un salto de línea:
echo -n "Escribe tu nombre: "
Comando read
read permite leer la entrada del usuario y guardarla en una variable:
#!/bin/bash
echo "¿Cuál es tu nombre?"
read nombre # El usuario escribe su nombre
echo "Hola, $nombre"
Puedes combinar echo -n y read en una línea más compacta:
#!/bin/bash
echo -n "Escribe tu edad: "
read edad
echo "Tu edad es $edad"
Operaciones aritméticas con enteros
Bash no hace operaciones con + - * / directamente como en otros lenguajes, necesitas usar:
a) let:
#!/bin/bash
a=5
b=3
let c=a+b
echo "La suma es $c"
b)
$(( )) (forma más moderna y recomendada):
#!/bin/bash
a=10
b=4
suma=$((a + b))
resta=$((a - b))
multiplicacion=$((a * b))
division=$((a / b))
echo "Suma: $suma"
echo "Resta: $resta"
echo "Multiplicación: $multiplicacion"
echo "División: $division"
c) % operador módulo:
#!/bin/bash
a=10
b=3
mod=$((a % b))
echo "El resto de $a dividido $b es $mod"
Ejemplo completo
#!/bin/bash
# Script que pide dos números y hace operaciones
echo -n "Ingresa el primer número: "
read num1
echo -n "Ingresa el segundo número: "
read num2
suma=$((num1 + num2))
resta=$((num1 - num2))
multiplicacion=$((num1 * num2))
division=$((num1 / num2))
modulo=$((num1 % num2))
echo "Suma: $suma"
echo "Resta: $resta"
echo "Multiplicación: $multiplicacion"
echo "División: $division"
echo "Módulo: $modulo"
Guardas como [Link], le das permisos con chmod +x [Link] y lo ejecutas con
./[Link].
Te pedirá los números y mostrará los resultados.
Gestión de procesos y comandos en la terminal Linux
1. Ejeución y control de comandos
Comando time: Permite medir el tiempo de ejecución de un comando. Se usa anteponiendo time al
comando deseado, y al final muestra estadísticas de consumo de tiempo. Es útil para cronometrar procesos.
o Ejemplo de uso: time <comando>
Ctrl + Z (Pausa): En la terminal, a diferencia de un entorno gráfico donde Ctrl + Z suele deshacer, este
comando pausa el proceso que se está ejecutando en primer plano.
o Recuperación tras pausa: Al pausar un proceso con Ctrl + Z, el sistema nos devuelve el
prompt y un número que identifica el proceso (usualmente "1"). Este número es el número de
proceso (PID).
Ctrl + C (Cancelar): Cancela el programa que está corriendo en primer plano. Si se ejecuta en el
prompt sin un programa en ejecución, no hace nada, aunque podría tener un efecto colateral de guardar el
historial de comandos en algunos servidores.
Ejecución en segundo plano (&):
o Al ejecutar un comando seguido de & (Ampersand), el proceso se ejecuta en segundo plano. Esto
permite seguir usando la terminal para otras tareas.
o Relevancia: Es útil para programas "tranquilos" que demoran mucho y no requieren interacción
constante o mostrar información por pantalla. Por ejemplo, copiar muchos archivos para un
respaldo.
o Limitación: No es posible pausar un programa que ya se está ejecutando en segundo plano
utilizando Ctrl + Z directamente, ya que la terminal no está en primer plano con ese programa.
o Ventaja: Evita la necesidad de abrir múltiples terminales para ejecutar tareas largas.
FG (Foreground): Trae un proceso que está en segundo plano al primer plano para su interacción.
o Uso: fg <número_de_proceso> o fg %<número_de_proceso>. El % se puede omitir en Linux,
pero es parte del estándar POSIX.
BG (Background): Reanuda un proceso pausado y lo envía a segundo plano.
o Uso: bg <número_de_proceso> o bg %<número_de_proceso>.
2. Monitoreo de Procesos
jobs: Muestra los procesos que se están ejecutando en segundo plano o que están pausados en la sesión
actual.
o Funcionalidad: Informa el estado de los procesos (por ejemplo, si uno acaba de terminar).
o Persistencia: El sistema mantiene un proceso "terminado" visible por unos segundos en jobs,
lo que permite consultarlo antes de que desaparezca completamente.
PS (Process Status): Muestra información sobre los procesos.
o ps (básico): Muestra los procesos de la sesión actual del usuario actual. Usualmente muestra el
propio comando ps y bash (la shell).
o ps -eF o ps -eA: Muestra información más detallada de los procesos, incluyendo columnas
como PID (identificador de proceso), PPID (identificador de proceso padre), STAT (estado), USER
(usuario), etc. El orden de las letras (e, F, A) puede variar, pero las tres juntas (-eF o -eA) suelen
mostrar una vista completa.
PID: Identificador único de un proceso. Es crucial porque los nombres de los programas
pueden repetirse, pero el PID no.
PPID: Identificador del proceso padre.
STAT: Muestra el estado del proceso (ver sección 3).
o ps -u <usuario>: Filtra los procesos por un usuario específico.
3. Estados de los Procesos (STAT)
La columna STAT en el comando ps puede mostrar diferentes letras que indican el estado de un proceso:
I (Idle): Hilo del kernel libre, no está haciendo nada.
R (Running): El proceso está corriendo o está listo para correr (en la cola de ejecución).
S (Sleeping): El proceso está durmiendo, esperando un evento para completarse.
T: Detenido por una señal (por ejemplo, Ctrl + Z).
Z (Zombie): Un proceso que terminó, pero su padre ya no existe o no ha recogido su estado. Se queda
ahí un ratito antes de desaparecer completamente.
X (Dead): Un proceso muerto, no debería ser visto.
Modificadores de prioridad:
o < (Menor que): Alta prioridad.
o N: Baja prioridad.
4. Programación de Tareas y Notificaciones
crontab: Es un programa y un archivo que permite programar tareas para que se ejecuten
automáticamente en momentos específicos.
mail: Un comando que permite enviar correos electrónicos. Puede ser usado en scripts para enviar
notificaciones sobre el resultado de tareas programadas (por ejemplo, si un respaldo falló).
5. Copia de Archivos (CP) y Control de Salida
cp -i o cp -v:
o cp -i: Pregunta antes de sobrescribir archivos.
o cp -v: Muestra lo que va haciendo (verboso).
o Redirección a archivo: La salida de estos comandos, en lugar de mostrarse por pantalla,
puede redirigirse a un archivo (cp -v <origen> <destino> > log_copia.txt). Esto permite monitorear
el progreso del comando en segundo plano sin saturar la terminal.
6. Comandos de Detención (kill)
kill <PID>: Envía una señal a un proceso para que termine.
o kill -15 <PID> (SIGTERM): Es la señal por defecto (si no se especifica un número). Pide
amablemente al proceso que termine.
o kill -9 <PID> (SIGKILL): Mata el proceso violentamente. No permite que el proceso realice
una "limpieza" o cierre ordenado, lo que puede dejar archivos corruptos o segmentos de memoria
ocupados.
o Recomendación: Siempre intentar kill -15 primero. Si el proceso no responde, entonces usar
kill -9.
o Equivalencia con Ctrl + Z: kill -2 <PID> (SIGINT) es equivalente a presionar Ctrl + C
cuando el proceso está en primer plano.
Identificación Única de Procesos: El PID (Process ID) es fundamental para identificar un
proceso de forma única, especialmente cuando se ejecutan múltiples instancias del mismo programa. Matar
un proceso por su nombre podría afectar a otras instancias no deseadas.