Saltar a contenido

Ejercicios Bash

Colección de ejercicios para la UT07 (Scripting en Bash), ordenados de menor a mayor dificultad en 6 niveles.

  • Nivel 1 (ejercicios 1–20): Scripts secuenciales sencillos, comandos básicos.
  • Nivel 2 (ejercicios 21–40): Scripts secuenciales con filtros: cut, awk, grep, sed, tr, sort.
  • Nivel 3 (ejercicios 41–60): Estructuras condicionales: if, if-else, elif, case.
  • Nivel 4 (ejercicios 61–80): Estructuras de bucles: for, while, until.
  • Nivel 5 (ejercicios 81–90): Funciones.
  • Nivel 6 (ejercicios 91–100): Scripts reales.

ENTREGA

El alumnado debe crear un repositorio propio en GitHub llamado addscripts, con una carpeta bash en la raíz. Dentro de esa carpeta se subirá la solución de cada uno de los 100 ejercicios, con el nombre ej001.sh … ej100.sh, respetando.

CALIFICACIÓN

La redacción de los scripts no es lo único que se evalúa. Se valorará por igual:

  • Comentarios: cada script debe explicar qué hace, con comentarios claros en las partes clave (declaración de variables, condiciones, bucles, etc.).
  • Indentado: el código debe estar correctamente indentado y ser legible, siguiendo una estructura consistente en todo el repositorio.
  • Un script que funcione pero sin comentarios ni indentado no se considerará completo.

🟢 1 · Scripts secuenciales sencillos (comandos básicos)

1 — Hola mundo

Crea el script hola.sh que muestre por pantalla el mensaje Hola mundo, soy tu primer script.

2 — ¿Quién y dónde?

Script que muestre el nombre del usuario que lo ejecuta, la fecha y hora actuales y el directorio en el que se encuentra.

3 — Saludo personalizado

Pide al usuario su nombre por teclado y muéstrale un saludo utilizando esa variable.

4 — Estructura de carpetas

Crea la carpeta practicas con las subcarpetas teoria, ejercicios y entregas en una sola orden, y muestra después la estructura creada.

5 — Copia de /etc/passwd

Copia el fichero /etc/passwd al directorio actual con el nombre copia_passwd.txt y muestra sus permisos y tamaño.

6 — Calculadora secuencial

Pide dos números por teclado y muestra su suma, resta, multiplicación y división entera usando $(( )).

7 — Calendario y actividad

Muestra el calendario del mes actual, el tiempo que lleva encendida la máquina y los usuarios conectados.

8 — Fichero con contenido

Crea el fichero notas.txt, añádele tres líneas de texto con echo y redirección, y muéstralo numerando las líneas.

9 — Datos de la máquina

Muestra el nombre de la máquina, el número de usuarios conectados y la versión del kernel.

10 — Variables

Define las variables NOMBRE, MODULO y NOTA, y muéstralas dentro de una frase completa.

11 — Información de un fichero

Pide el nombre de un fichero y muestra su tamaño legible y el tipo de contenido (ls -lh y file).

12 — Principio y final

Muestra las 10 primeras y las 10 últimas líneas de /etc/passwd, con un mensaje separador entre ambas.

13 — Renombrar y mover

Crea el fichero borrador.txt, renómbralo a definitivo.txt y muévelo a una carpeta entregado creada por el script.

14 — Los comandos

Muestra la ruta de los ejecutables de bash, ls y grep, y el tipo de comando que es cd.

15 — Redirecciones

Guarda el listado largo de /etc en listado.txt, los errores de listar /root en errores.txt, y muestra cuántas líneas tiene cada fichero.

16 — Variables especiales

Muestra el PID del script ($$), su nombre ($0) y el número de parámetros recibidos ($#).

17 — Parámetros inverso

Script que reciba dos palabras como parámetros y las muestre en orden inverso al recibido.

18 — Disco y memoria

Muestra el espacio libre de los sistemas de ficheros y el estado de la memoria, ambos en formato legible.

19 — Enlaces

Crea un fichero original.txt, un enlace simbólico enlace_blando y un enlace duro enlace_duro hacia él, y compáralos con ls -li.

20 — Edad aproximada

Pide el año de nacimiento del usuario y calcula su edad aproximada usando el año actual obtenido con date.

🟡 2 · Scripts secuenciales con filtros (cut, awk, grep, sed…)

21 — Usuarios con cut

Muestra únicamente los nombres de usuario de /etc/passwd utilizando cut.

22 — Usuario y shell con awk

Muestra el nombre de usuario y su shell separados por una tabulación, utilizando awk -F:.

23 — Contador wc

Pide el nombre de un fichero y muestra por separado su número de líneas, de palabras y de caracteres.

24 — Filtrando con grep

Muestra los usuarios de /etc/passwd que utilizan bash como shell, y cuántos son.

25 — Duplicados

A partir de un fichero de nombres (créalo en el script), muéstralo ordenado alfabéticamente y sin duplicados.

26 — Mayúsculas con tr

Pide una frase por teclado y muéstrala en mayúsculas y después sin espacios.

27 — Sustituciones con sed

Crea un fichero con varias líneas que contengan la palabra Windows y sustituye todas sus apariciones por Linux, mostrando el resultado.

28 — UID más alto

Muestra la línea de /etc/passwd correspondiente al usuario con el UID más alto (ordena numéricamente por el campo 3).

29 — Top de memoria

Muestra los 5 procesos que más memoria consumen: usuario, PID y %MEM, usando ps aux, sort y awk.

30 — Contando entradas

Muestra cuántos ficheros y cuántos directorios hay en el directorio actual (sin contar ocultos).

31 — Mi IP

Muestra únicamente la dirección IP principal de la máquina filtrando la salida de ip a (o hostname -I).

32 — Trocear la fecha

A partir de date +%d/%m/%Y, extrae y muestra por separado el día, el mes y el año usando cut.

33 — Los 5 más pesados

Muestra los 5 ficheros o carpetas que más ocupan dentro del HOME del usuario.

34 — Líneas concretas

Muestra únicamente las líneas 5 a 10 de /etc/passwd (hazlo de dos formas: head+tail y sed -n).

35 — Contar vocales

Pide el nombre de un fichero y muestra cuántas vocales contiene en total (usa tr y wc).

36 — Informe con tee

Genera un informe con el nombre de la máquina, la lista de usuarios humanos y su total, mostrándolo por pantalla y guardándolo a la vez en informe.txt con tee.

37 — Suma con awk

Suma el tamaño en bytes de todos los ficheros del directorio actual usando ls -l y awk.

38 — Buscar y contar

Pide una palabra y un fichero, y muestra cuántas líneas del fichero la contienen y cuáles son (con número de línea).

39 — Mis procesos

Muestra los procesos del usuario actual mostrando solo PID y comando, ordenados por PID.

40 — Shells del sistema

Muestra la lista de shells distintas que aparecen en /etc/passwd y cuántos usuarios usa cada una.

🟠 3 · Estructuras condicionales (if, if-else, case)

41 — Positivo o negativo

Pide un número y muestra si es positivo, negativo o cero.

42 — Par o impar

Pide un número y muestra si es par o impar usando el operador módulo.

43 — ¿Existe el fichero?

Script que reciba un nombre de fichero como parámetro y muestre si existe o no. Si no recibe parámetro, mostrará un error de uso y terminará con exit 1.

44 — ¿Fichero o directorio?

Recibe una ruta como parámetro e indica si es un fichero regular, un directorio o no existe (usa if / elif / else).

45 — Permisos

Recibe un fichero como parámetro y comprueba, uno a uno, si tienes permiso de lectura, de escritura y de ejecución sobre él.

46 — El mayor de dos

Pide dos números y muestra cuál es mayor, o si son iguales.

47 — Validar parámetros

Script que exige exactamente dos parámetros: si no los recibe muestra la sintaxis correcta y sale con código 1; si los recibe, los muestra numerados.

48 — ¿Existe el usuario?

Pide un nombre de usuario y comprueba si existe en el sistema (usa id o grep sobre /etc/passwd).

49 — Calificaciones

Pide una nota de 0 a 10 y muestra la calificación: insuficiente, suficiente, bien, notable o sobresaliente. Controla que la nota sea válida.

50 — Cadenas

Pide dos cadenas: comprueba si la primera está vacía y si ambas son iguales o distintas.

51 — ¿Eres root?

Comprueba si el script se está ejecutando como root; si no, avisa de que hacen falta privilegios y termina con código 1.

52 — Día de la semana (case)

Pide un número del 1 al 7 y muestra el día de la semana correspondiente usando case, con opción por defecto para valores no válidos.

53 — Vocal o consonante

Pide una letra y di si es vocal o consonante usando case con patrones. Controla que se introduzca una única letra.

54 — Opciones de comando

Script que admita las opciones -f (fecha), -u (usuario), -d (directorio) y -h (ayuda) como primer parámetro, resolviéndolas con case.

55 — ¿Servicio activo?

Recibe el nombre de un servicio y comprueba con systemctl is-active si está activo, mostrando un mensaje distinto en cada caso.

56 — Año bisiesto

Pide un año y determina si es bisiesto (divisible entre 4 y no entre 100, salvo que lo sea entre 400).

57 — Tipo de extensión

Recibe un nombre de fichero e indica según su extensión si es un texto (.txt), un script (.sh), una imagen (.jpg/.png) o un tipo desconocido.

58 — Rango de edad

Pide la edad y comprueba con operadores lógicos si está en edad laboral (entre 16 y 67 incluidos).

59 — ¿Hay internet?

Comprueba con un solo ping a 8.8.8.8 si hay conexión, decidiendo según el código de salida $?.

60 — Mini calculadora (case)

Pide dos números y una operación (+, -, x, /) y resuélvela con case, controlando la división por cero.

🔵 4 · Estructuras de bucles (for, while, until)

61 — Contando con for

Muestra los números del 1 al 10 usando un bucle for.

62 — Tabla de multiplicar

Pide un número y muestra su tabla de multiplicar completa (del 1 al 10).

63 — Saludos en serie

Recorre con for una lista de nombres definida en el script y saluda a cada uno.

64 — Recorrer ficheros

Recorre los ficheros del directorio actual mostrando su nombre y tamaño en líneas del tipo fichero.txt ocupa 120 bytes.

65 — Cuenta atrás

Cuenta atrás de 10 a 0 mostrando un número por segundo y termina con el mensaje ¡Despegue!.

66 — Leer línea a línea

Lee un fichero línea a línea con while read y muéstralo numerando cada línea manualmente (sin usar cat -n).

67 — Suma hasta N

Pide un número N y suma todos los enteros de 1 a N con un bucle while.

68 — Contraseña con until

Pide una contraseña con until hasta que el usuario escriba secreto, contando los intentos.

69 — Menú repetitivo

Menú con while + case con las opciones: 1) fecha, 2) usuarios conectados, 3) directorio actual y 0) salir. Se repetirá hasta pulsar 0.

70 — Comprobar parámetros

Recorre con for todos los parámetros recibidos ("$@") e indica para cada uno si es un fichero existente o no.

71 — Adivina el número

Genera un número aleatorio del 1 al 100 con $RANDOM y deja que el usuario lo adivine en bucle, indicando si el número buscado es mayor o menor.

72 — Creación en lote

Crea con un bucle los ficheros fich01.txt a fich10.txt (usa printf "%02d" para el número) y comprueba al final cuántos se han creado.

73 — Todas las tablas

Muestra las tablas de multiplicar del 1 al 10 con dos bucles anidados, separando cada tabla con una línea.

74 — Suma

Lee números en bucle: los negativos se ignoran (continue) y el 0 finaliza (break). Al terminar, muestra la suma de los positivos introducidos.

75 — Usuarios humanos

Recorre los usuarios de /etc/passwd y muestra solo los que tienen UID mayor o igual a 1000, con su UID.

76 — Renombrado masivo

Añade el prefijo bak_ a todos los ficheros .txt del directorio actual usando un bucle for y mv.

77 — Factorial

Pide un número y calcula su factorial con un bucle while.

78 — Recorrer /etc/passwd

Lee /etc/passwd con while read cambiando IFS a : y muestra El usuario X usa la shell Y con formato de columnas.

79 — Mini monitor

Toma 3 muestras de la carga del sistema (una cada 5 segundos) con uptime y guárdalas con su hora en monitor.log, mostrando el log al final.

80 — Pirámide de asteriscos

Pide una altura N y dibuja una pirámide de asteriscos de N filas con bucles anidados.

🟣 5 · Funciones

81 — Primera función

Define una función saludar que reciba un nombre como parámetro y lo salude. Llámala tres veces con nombres distintos.

82 — Función que devuelve

Define una función suma que reciba dos números y devuelva el resultado con echo, capturándolo desde el programa principal con $( ).

83 — Máximo de dos números

Define una función maximo que muestre el mayor de los dos números recibidos, y otra es_par que use return para indicar con el código de salida si un número es par, comprobándolo con $?.

84 — Función reutilizada

Define una función comprobar_fichero que indique si la ruta recibida existe y de qué tipo es, y úsala sobre /etc/passwd, /tmp y un fichero inexistente.

85 — Biblioteca de funciones

Crea un fichero biblioteca.sh con al menos dos funciones (por ejemplo linea y cabecera) y un script principal que las cargue con source y las utilice.

86 — Variables locales

Demuestra la diferencia entre una variable global y una local dentro de una función, mostrando su valor antes, dentro y después de la llamada.

87 — Factorial recursivo

Implementa el factorial mediante una función recursiva.

88 — Validación reutilizable

Define una función validar_numero que compruebe con una expresión regular que el dato recibido es un entero, y úsala para validar los dos números que pide el programa antes de operarlos.

89 — Función de log

Define una función log_msg que reciba un mensaje y lo añada a actividad.log con la fecha y hora. Utilízala en varios puntos de un script de ejemplo.

90 — Menú con funciones

Construye un menú repetitivo donde cada opción llame a una función distinta (fecha, espacio en disco, usuarios conectados) — misma estructura que el supuesto de examen de la UT07.

🔴 6 · Scripts reales

91 — Copia de seguridad

Script que reciba una carpeta como parámetro, la comprima en ~/backups/nombre_AAAA-MM-DD.tar.gz (creando la carpeta si no existe) y elimine los backups con más de 7 días.

92 — Alta masiva de usuarios

Script (para root) que lea un fichero con líneas usuario:grupo y cree cada usuario en su grupo, creando antes el grupo si no existe y omitiendo los usuarios ya existentes. Debe mostrar un resumen final.

93 — Alerta de disco

Script que revise el porcentaje de ocupación de cada partición y avise de las que superen un umbral (parámetro, por defecto 80 %), registrando las alertas en un log.

94 — Informe del sistema

Script que genere un informe informe_HOSTNAME_FECHA.txt con: sistema operativo, kernel, IP, uptime, disco, memoria y los 5 procesos que más CPU consumen.

95 — Vigilante de servicios

Script (para root) que reciba un nombre de servicio, compruebe si está activo y, si está caído, intente reiniciarlo, dejando constancia de todo en /var/log/vigilante.log.

96 — Limpiador de temporales

Script que busque en una ruta dada ficheros *.tmp y *~, muestre cuántos son y el espacio que ocupan, y los borre solo si el usuario confirma con s.

97 — Rotador de logs

Script que recorra los .log de una carpeta y, para los que superen un tamaño máximo (parámetro en KB), los comprima con fecha en una subcarpeta antiguos/ y deje el original vacío.

98 — CSamba

Script (para root) que pida el nombre de una carpeta, la cree con todos los permisos, la comparta por Samba para toda la red (añadiendo la sección a smb.conf) y reinicie el servicio. Si Samba no está instalado, debe instalarlo.

99 — Accesos fallidos

Script que analice un log de autenticación (por defecto /var/log/auth.log) y muestre el top 5 de usuarios y de IPs con intentos fallidos de acceso.

100 — Programa con menú

Programa gestor.sh al estilo del examen de la UT07: menú repetitivo con una función por opción — 1) buscar un fichero en el sistema y contar sus vocales, 2) crear un fichero con nombre y tamaño dados (con valores por defecto), 3) lista de la compra sin duplicados y con contador de elementos, 0) salir. Código comentado, variables con nombres claros e indentación correcta.