Scripts en Bash - Examen
Ejercicio 1
- Realizar un script que copie todos los ficheros que se le pasen por parámetro, al directorio misDatos. Si el directorio misDatos no existe, se deberá crear.
#!/bin/bash
directorio="misDatos"
# ! -d comprueba si el directorio existe, si no, lo crea
if [ ! -d "$directorio" ]; then
mkdir "$directorio"
fi
# Recorre cada fichero en el array de ficheros $@ pasados como parámetros y los copia en directorio
for fichero in "$@"; do
if [ -e "$fichero" ]; then
cp "$fichero" "$directorio/"
fi
doneEjercicio 2
- Realizar un script que muestre el nombre de cada uno de los ficheros pasados por parámetro y visualice su contenido por pantalla. En caso de no pasar ningún parámetro se mostrará un mensaje de error.
#!/bin/bash
# Comprueba si se han pasado parámetros
if [ $# -eq 0 ]; then
echo "Error: No se han pasado ficheros por parámetro."
exit 1
fi
# Recorre todos los ficheros pasados por parámetro y los muestra con cat
for fichero in "$@"; do
if [ -e "$fichero" ]; then
echo "=== Fichero: $fichero ==="
cat "$fichero"
echo ""
fi
doneEjercicio 3
- Realizar un script que cree un fichero de nombre Copia.tar.gz, donde se almacenen comprimidos todos los ficheros que se pasen por parámetro. En caso de no pasar ningún parámetro se mostrará un mensaje de error.
if [ $# -eq 0 ]; then
echo "Error: No se han pasado ficheros por parámetro."
exit 1
fi
tar -czf Copia.tar.gz "$@"El comando crea un archivo comprimido llamado Copia.tar.gz que contiene todos los ficheros pasados como parámetros:
-c— crea un nuevo archivo tar-z— comprime con gzip-f Copia.tar.gz— nombre del fichero de salida"$@"— todos los parámetros recibidos por el script
Ejercicio 4
- Realizar un script que muestre el nombre de cada uno de los ficheros pasados por parámetro y el tipo de fichero que es.
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Error: No se han pasado ficheros por parámetro."
exit 1
fi
for fichero in "$@"; do
if [ -e "$fichero" ]; then
tipo=$(file -b "$fichero")
echo "$fichero: $tipo"
fi
doneEl comando file -b muestra el tipo de fichero en modo reducido (brief)
Ejercicio 5
- Contar líneas de un archivo pasado como parámetro, solo uno
# Comprueba que se pasa un único parámetro
if [ $# -ne 1 ]; then
echo "Uso: $0 <archivo>"
exit 1
fi
wc -l < "$1"Ejercicio 6
- Buscar palabra en archivos de un directorio
# Comprueba que se pasan 2 parámetros
if [ $# -ne 2 ]; then
echo "Uso: $0 <directorio> <palabra>"
exit 1
fi
grep -rl "$2" "$1"-r: búsqueda recursiva en directorios-l: solo muestra nombres de archivo que contienen la coincidencia (no el contenido)
Ejercicio 7
- Suma de números pasados como argumentos
sum=0
# Recorre el array que forman todos los parámetros
for n in "$@"; do
((sum += n))
done
echo $sumEjercicio 8
- Copia de seguridad incremental por fecha de carpeta pasada por parámetro
Versión 1
function f_Uso(){
echo "Uso: $0 <directorio>"
exit 1
}
if [ $# -eq 1 ]; then
fecha=$(date +%Y%m%d)
tar -czf "backup_${fecha}.tar.gz" "$1"
else
echo "Error: Número de parámetros incorrecto"
f_Uso
fi
# tar -czf "backup_$(date +%Y%m%d).tar.gz" "$1" Todo en la misma lineaVersión 2 Ampliada
#!/bin/bash
function f_Ayuda () {
echo "Script que genera una copia de seguridad de un directorio indicado como argumento"
echo "Sintaxis:"
echo "$0 <DIRECTORIO>"
echo "😭"
}
DIRECTORIO=$1
FECHA=$(date +%Y%m%d)
if [ -z "$DIRECTORIO" ]; then
f_Ayuda
exit 1
fi
# -z cadena vacía
if [ ! -d "$DIRECTORIO" ]; then
echo "Error: El directorio $1 no existe"
exit 1
fi
# -d directorio.
NOMBRE_BACKUP="backup_$DIRECTORIO_$FECHA.tar.gz"
echo $NOMBRE_BACKUP
tar -czf $NOMBRE_BACKUP $DIRECTORIO
if [ $? -eq 0 ]; then
echo "Backup creado: $NOMBRE_BACKUP"
else
echo "Error al crear el backup"
exit 1
fiEjercicios de oposiciones
1 Diseñar un shell script para bash que ofrezca en la salida estándar el siguiente menú:
- 1] Listar archivos
- 2] Ver directorio de trabajo
- 3] Crear directorio
- 4] Borrar directorio
- 5] Crear usuario
- 6] Borrar usuario
- 7] Salir
- Introducir opción:
Si se solicita la opción:
1 Se listan los archivos del directorio actual.
2 Se muestra el nombre del directorio actual.
3 Se solicita un nombre de directorio y se crea dentro del directorio actual.
4 Se solicita un nombre de directorio y se borra, suponiendo que está vacio y ubicado en el directorio actual.
5 Se comprueba si el script lo está ejecutando el root, y si lo es, se solicita un login de usuario y se añade al sistema, creando en ese momento su directorio personal, que estará ubicado en /home y llevará por nombre el del propio login de usuario. Si no se es root, se mostrará una advertencia.
6 Se comprueba si el script lo esta ejecutando el root, y si lo es, se solicita un login de usuario y se borra del sistema, eliminando también su directorio personal. Si no se es root, se mostrará una advertencia
7 Se finaliza la ejecución, mostrando el mensaje Fin de Ejecucion
Si se introduce una opción no válida se indicará esta circunstancia en la salida estándar.
Tras ejecutar cualquiera de las opciones válidas, salvo en el caso de la 7, se imprimirá de nuevo el menú, en espera de recibir otra solicitud.
Diseñar el script empleando funciones shell para cada una de las opciones 1 a 6.
#!/bin/bash
#Función que muestra el menú del programa
f_menu() {
echo -e "\n-----Menu-----"
echo "1] Listar archivos"
echo "2] Ver directorio de trabajo"
echo "3] Crear directorio"
echo "4] Borrar directorio"
echo "5] Crear usuario"
echo "6] Borrar usuario"
echo "7] Salir"
read -p "Introduzca opción: " OPC
echo -e "\n"
}
#Función que lista los archivos del directorio actual
f_listar_archivos(){
ls
}
#Función que muestra el directorio actual
f_ver_directorio_t(){
pwd
}
#Función que solicita el nombre de un directorio y lo crea
f_crear_directorio(){
read -p "Introduzca el nombre del directorio a crear: " DIRECTORIO
mkdir $DIRECTORIO && echo "El directorio $DIRECTORIO ha sido creado"
}
#Función que solicita el nombre de un directorio y lo borra
f_borrar_directorio(){
read -r -p "Introduzca el nombre del directorio a borrar: " DIRECTORIO
if [ -z "$DIRECTORIO" ]; then
echo "No ha indicado ningún directorio"
return 1
fi
if [[ ! -e "$DIRECTORIO" || ! -d "$DIRECTORIO" ]]; then
echo "El directorio $DIRECTORIO no existe o no es un directorio"
return 1
fi
if rmdir -- "$DIRECTORIO"; then
echo "El directorio $DIRECTORIO ha sido borrado"
else
echo "Error al borrar $DIRECTORIO"
return 1
fi
}
#Función que crea un usuario
f_crear_usuario(){
if [ $UID -eq 0 ]; then
read -p "Introduzca el nombre del usuario a crear: " USUARIO
useradd -m $USUARIO
if [ $? -eq 0 ]; then
echo "El usuario $USUARIO ha sido creado con éxito"
fi
else
echo "ADVERTENCIA: ¡Hay que ser root para crear usuarios!"
fi
}
#Función que borra un usuario
f_borrar_usuario(){
if [ $UID -eq 0 ]; then
read -p "Introduzca el nombre del usuario a borrar: " USUARIO
userdel -r $USUARIO
if [ $? -eq 0 ]; then
echo "El usuario $USUARIO ha sido borrado con éxito"
fi
else
echo "ADVERTENCIA: ¡Hay que ser root para borrar usuarios!"
fi
}
#PROGRAMA PRINCIPAL
while true
do
f_menu
case $OPC in
1) f_listar_archivos;;
2) f_ver_directorio_t;;
3) f_crear_directorio;;
4) f_borrar_directorio;;
5) f_crear_usuario;;
6) f_borrar_usuario;;
7) echo "Fin de ejecución"
exit 0;;
*) echo -e "Opción no válida. Inténtelo de nuevo \n";;
esac
done2. Implementación de la funcionalidad de la papelera de escritorio con dos shell scripts en linux.
Los scripts son delete y undelete. El script delete mueve el fichero o directorio deseado a un directorio de nombre TRASHDIR que ha de estar en el directorio home de cualquier usuario. Si no se encuentra, hay que crearlo.
La recuperación del fichero o directorio borrado se realizará en el directorio actual de trabajo.
Los scripts deberán de ser llamados por su nombre.
delete.sh
#!/bin/bash
#Función que explica como ejecutar el scripts
function f_uso(){
echo "USO: $0 <fichero|directorio>"
exit 1
}
#INICIO PROGRAMA
#Ejecución con número de parámetros correcto
if [ $# -eq 1 ]
then
#Comprobamos si existe un fichero o directorio con el
#nombre que se ha pasado como parámetro
if [ -f $1 -o -d $1 ]; then
if [ ! -d ~/TRASHDIR ]; then
mkdir ~/TRASHDIR && echo "Directorio TRASHDIR creado"
fi
mv $1 ~/TRASHDIR && echo ""$1" se ha movido al directorio TRASHDIR"
#Si no es un archivo o directorio se muestra un mensaje
else
echo "No existe ningún fichero o directorio llamado "$1""
fi
#Ejecución con número de parámetros incorrecto
else
echo "ERROR: Ejecución con número de parámetros incorrecto"
f_uso
fiundelete.sh
#!/bin/bash
#Función que explica como ejecutar el script
function f_uso(){
echo "USO: $0 <fichero|directorio>"
exit 1
}
#INICIO PROGRAMA
#Ejecución con número de parámetros correcto
if [ $# -eq 1 ]; then
#Comprobamos si existe el fichero pasado como parámetro
#dentro de la carpeta ~/TRASHDIR
if [ -f ~/TRASHDIR/$1 -o -d ~/TRASHDIR/$1 ]
then
mv ~/TRASHDIR/$1 $PWD && echo ""$1" se ha movido al directorio actual de trabajo ($PWD)"
#Si no existe un archivo o directorio con tal nombre
#en la carpeta ~/TRASHDIR que muestre un mensaje
else
echo "No existe ningún fichero o directorio llamado "$1" en la carpeta TRASHDIR"
fi
#Ejecución con número de parámetros incorrecto
else
echo "ERROR: Ejecución con número de parámetros incorrecto"
f_uso
fi3. Examen de Bash: Programa Menú de Comandos Básicos
Enunciado
Desarrolle un script de Bash que presente un menú interactivo para ejecutar comandos básicos de Linux. El programa debe cumplir con los siguientes requisitos:
Funcionalidad principal
- Mostrar un menú de opciones que se repita indefinidamente hasta que el usuario seleccione la opción de salir.
- Cada opción del menú debe estar implementada como una función separada.
- Utilizar la estructura
casepara la selección de opciones. - Limpiar la pantalla y volver a mostrar el menú después de cada operación (excepto al salir).
Opciones requeridas (mínimo 11 además de salir)
- Listar contenido del directorio actual (con detalles)
- Mostrar directorio actual
- Mostrar fecha y hora actual
- Mostrar uso de disco
- Mostrar uso de memoria
- Mostrar usuarios conectados
- Crear un directorio (solicitando nombre al usuario)
- Eliminar un directorio (solicitando nombre al usuario)
- Copiar un archivo (solicitando origen y destino)
- Mover o renombrar un archivo (solicitando origen y destino)
- Mostrar contenido de un archivo (solicitando nombre)
- Salir del programa
Requisitos adicionales
- El script debe comenzar con el shebang adecuado para Bash.
- Debe ser ejecutable (
chmod +x). - Manejar errores básicos (por ejemplo, intentar eliminar un directorio que no existe o no está vacío, copiar un archivo que no existe, etc.).
- Utilizar
readpara obtener entrada del usuario cuando sea necesario. - Mensajes claros y amigables para el usuario.
Entregable
Un único archivo de script Bash (por ejemplo, menu_comandos.sh) que implemente todas las funcionalidades descritas.
Nota para el docente
Este ejercicio evalúa:
- Estructuras de control (
while,case) - Definición y uso de funciones
- Manejo de entrada/salida
- Comandos básicos de Linux
- Buenas prácticas de scripting (limpieza de pantalla, manejo de errores, mensajes claros)
No se proporcionará código de ejemplo. Los estudiantes deben desarrollar la solución por completo.
#!/usr/local/bin/bash
# Menu-driven program for basic Linux commands
# Function definitions
show_menu() {
clear
echo "=============================="
echo " Menú de Comandos Básicos "
echo "=============================="
echo "1) Listar contenido de directorio"
echo "2) Mostrar directorio actual"
echo "3) Mostrar fecha y hora"
echo "4) Mostrar uso de disco"
echo "5) Mostrar uso de memoria"
echo "6) Mostrar usuarios conectados"
echo "7) Crear un directorio"
echo "8) Eliminar un directorio"
echo "9) Copiar un archivo"
echo "10) Mover o renombrar un archivo"
echo "11) Mostrar contenido de un archivo"
echo "12) Salir"
echo -n "Seleccione una opción: "
}
list_dir() {
echo "Contenido del directorio actual:"
ls -la
echo
read -p "Presione Enter para continuar..."
}
show_pwd() {
echo "Directorio actual: $(pwd)"
echo
read -p "Presione Enter para continuar..."
}
show_date() {
echo "Fecha y hora actuales: $(date)"
echo
read -p "Presione Enter para continuar..."
}
show_disk_usage() {
echo "Uso de disco:"
df -h
echo
read -p "Presione Enter para continuar..."
}
show_mem_usage() {
echo "Uso de memoria:"
free -h
echo
read -p "Presione Enter para continuar..."
}
show_users() {
echo "Usuarios conectados:"
who
echo
read -p "Presione Enter para continuar..."
}
create_dir() {
read -p "Ingrese el nombre del directorio a crear: " dirname
if [ -z "$dirname" ]; then
echo "Nombre no puede estar vacío."
else
mkdir -p "$dirname" 2>/dev/null
if [ $? -eq 0 ]; then
echo "Directorio '$dirname' creado exitosamente."
else
echo "Error al crear el directorio '$dirname'."
fi
fi
echo
read -p "Presione Enter para continuar..."
}
delete_dir() {
read -p "Ingrese el nombre del directorio a eliminar: " dirname
if [ -z "$dirname" ]; then
echo "Nombre no puede estar vacío."
else
rmdir "$dirname" 2>/dev/null
if [ $? -eq 0 ]; then
echo "Directorio '$dirname' eliminado exitosamente."
else
echo "Error al eliminar el directorio '$dirname'. Puede que no esté vacío o no exista."
fi
fi
echo
read -p "Presione Enter para continuar..."
}
copy_file() {
read -p "Ingrese el archivo origen: " src
read -p "Ingrese el archivo destino: " dest
if [ -z "$src" ] || [ -z "$dest" ]; then
echo "Ambos campos son obligatorios."
else
cp "$src" "$dest" 2>/dev/null
if [ $? -eq 0 ]; then
echo "Archivo '$src' copiado a '$dest'."
else
echo "Error al copiar el archivo. Verifique que '$src' exista y tenga permisos."
fi
fi
echo
read -p "Presione Enter para continuar..."
}
move_file() {
read -p "Ingrese el archivo origen: " src
read -p "Ingrese el nuevo nombre o ruta destino: " dest
if [ -z "$src" ] || [ -z "$dest" ]; then
echo "Ambos campos son obligatorios."
else
mv "$src" "$dest" 2>/dev/null
if [ $? -eq 0 ]; then
echo "Archivo '$src' movido a '$dest'."
else
echo "Error al mover el archivo. Verifique que '$src' exista."
fi
fi
echo
read -p "Presione Enter para continuar..."
}
show_file_content() {
read -p "Ingrese el nombre del archivo a mostrar: " filename
if [ -z "$filename" ]; then
echo "Nombre de archivo no puede estar vacío."
elif [ ! -f "$filename" ]; then
echo "El archivo '$filename' no existe."
else
echo "Contenido de '$filename':"
cat "$filename"
fi
echo
read -p "Presione Enter para continuar..."
}
# Main loop
while true; do
show_menu
read option
case $option in
1) list_dir ;;
2) show_pwd ;;
3) show_date ;;
4) show_disk_usage ;;
5) show_mem_usage ;;
6) show_users ;;
7) create_dir ;;
8) delete_dir ;;
9) copy_file ;;
10) move_file ;;
11) show_file_content ;;
12)
echo "Saliendo del programa..."
exit 0
;;
*)
echo "Opción no válida. Intente nuevamente."
read -p "Presione Enter para continuar..."
;;
esac
done