Ejemplos Prácticos de Shell Scripting en Linux y Comandos Útiles
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 13 KB
Montar un Pendrive USB en Linux
Para montar un dispositivo USB (como un pendrive) en un directorio específico. Necesitarás saber el tipo de sistema de archivos (ej. vfat
, ntfs
, ext4
) y el nombre del dispositivo (ej. /dev/sda1
, /dev/sdb1
). Este comando generalmente requiere privilegios de superusuario (root).
# Reemplaza <filesystem_type> con el tipo correcto (ej. vfat)
sudo mount -t <filesystem_type> /dev/sda1 /mnt/pen
Mostrar Información del Usuario y Shell
Comandos para obtener información básica sobre la sesión actual:
echo "Usuario actual: $(whoami)"
echo "Último comando ejecutado: $(history 1)" # Muestra el comando más reciente del historial
echo "Nombre del script/shell: $0"
echo "Número de argumentos pasados: $#"
Script para Crear Estructura de Directorios (Empresa/Departamentos)
Este script crea una estructura de directorios básica para una empresa y un departamento, solicitando los nombres al usuario.
#!/bin/bash
# Script para crear una estructura de directorios para una empresa y sus departamentos
# Solicitar nombre de la empresa (usando el primer argumento si se proporciona)
if [ -n "$1" ]; then
empresa="$1"
echo "Usando el nombre de empresa proporcionado: $empresa"
else
read -p "Introduce el nombre de la empresa: " empresa
fi
# Crear directorio base para la empresa en el HOME del usuario
mkdir -p "$HOME/$empresa"
if [ $? -eq 0 ]; then
echo "Directorio de la empresa '$HOME/$empresa' creado."
else
echo "Error al crear el directorio de la empresa."
exit 1
fi
# Solicitar nombre del departamento
read -p "Introduce el nombre del primer departamento: " dep1
# Crear directorio para el departamento
mkdir -p "$HOME/$empresa/$dep1"
if [ $? -eq 0 ]; then
echo "Directorio del departamento '$HOME/$empresa/$dep1' creado."
else
echo "Error al crear el directorio del departamento."
exit 1
fi
echo "Estructura creada exitosamente."
Script para Contar Ocurrencias de un Patrón en Nombres de Archivo
Busca archivos/directorios cuyo nombre contenga un patrón específico (pasado como primer parámetro) y guarda la cuenta en un archivo (segundo parámetro).
Nota: Buscar desde la raíz (/
) puede ser muy lento y requerir permisos elevados. Considera limitar la búsqueda a directorios específicos como $HOME
.
#!/bin/bash
# Script que busca un patrón (primer parámetro) en nombres de archivo/directorio
# y guarda la cuenta en un archivo (segundo parámetro).
if [ "$#" -ne 2 ]; then
echo "Uso: $0 <patrón_busqueda> <archivo_salida>"
exit 1
fi
patron="$1"
archivo_salida="$2"
echo "Buscando elementos que contienen '$patron' en su nombre (desde /)..."
# Advertencia: 'find /' puede tardar mucho y requerir permisos.
# Considera usar 'find $HOME ...' o un directorio más específico.
count=$(find / -name "*$patron*" 2>/dev/null | wc -l)
echo "El patrón '$patron' aparece en $count nombres de archivo/directorio." > "$archivo_salida"
echo "Resultados guardados en '$archivo_salida'."
Script Simple de Papelera de Reciclaje
Mueve un archivo especificado a un directorio llamado PAPELERA
dentro de $HOME/mis_scripts
, añadiendo una marca de tiempo para evitar sobrescrituras.
#!/bin/bash
# Script para mover un archivo a una 'papelera'
if [ "$#" -ne 1 ]; then
echo "Uso: $0 <archivo_a_mover>"
exit 1
fi
archivo="$1"
# Asegúrate de que el directorio base para la papelera exista
papelera_dir_base="$HOME/mis_scripts"
papelera_dir="$papelera_dir_base/PAPELERA"
# Crear directorio base y de papelera si no existen
mkdir -p "$papelera_dir"
if [ ! -e "$archivo" ]; then
echo "Error: El archivo o directorio '$archivo' no existe."
exit 1
fi
# Generar un nombre único para evitar sobrescrituras
nombre_borrado="borrado_$(date +%Y%m%d_%H%M%S)_$(basename "$archivo")"
mv "$archivo" "$papelera_dir/$nombre_borrado"
if [ $? -eq 0 ]; then
echo "El elemento '$archivo' ha sido movido a la papelera como '$nombre_borrado'."
else
echo "Error al mover '$archivo' a la papelera."
exit 1
fi
Buscar Patrones Numéricos o Específicos en un Archivo
Este script utiliza grep
para buscar líneas dentro de un archivo (primer parámetro) que contengan dígitos (0-9) o cualquiera de los patrones de texto proporcionados como argumentos subsiguientes.
#!/bin/bash
# Script para buscar patrones dentro de un archivo pasado como parámetro.
if [ "$#" -lt 2 ]; then
echo "Uso: $0 <archivo> <patrón1> [patrón2] [patrón3] ..."
echo "Busca líneas que contengan dígitos o cualquiera de los patrones proporcionados."
exit 1
fi
archivo="$1"
shift # Quita el primer argumento (archivo), el resto son patrones
if [ ! -f "$archivo" ]; then
echo "Error: El archivo '$archivo' no existe o no es legible."
exit 1
fi
# Construir el patrón para grep (expresiones extendidas -E)
# Buscar líneas con dígitos O con alguno de los patrones (escapando caracteres especiales)
patrones_escapados=$(printf "%s\n" "$@" | sed 's/[][\\.*^$]/\\&/g' | paste -sd '|')
patron_final="[0-9]|($patrones_escapados)"
echo "Buscando en '$archivo' líneas que contengan dígitos o los patrones: $@"
grep -E --color=auto "$patron_final" "$archivo"
Script para Mostrar Números Pares Menores que un Límite
Muestra todos los números pares desde 0 hasta (pero sin incluir) el número límite proporcionado como argumento.
#!/bin/bash
# Script que muestra los números pares menores que el número pasado por parámetro.
if [ "$#" -ne 1 ] || ! [[ "$1" =~ ^[0-9]+$ ]]; then
echo "Uso: $0 <numero_limite_entero_positivo>"
exit 1
fi
limite=$1
echo "Números pares menores que $limite:"
for (( i=0; i < limite; i++ )); do
# Usar aritmética de Bash para calcular el resto
if (( i % 2 == 0 )); then
echo $i
fi
done
Ejemplo de Condicional `if test` (Pregunta Simple)
Un script simple que hace una pregunta y verifica la respuesta usando condicionales if
. Compara la respuesta ignorando mayúsculas/minúsculas.
#!/bin/bash
echo "¿Cómo se llamaba el mejor equipo del mundo: Real Madrid o Barça?"
read respuesta1
# Convertir a minúsculas para comparación insensible a mayúsculas/minúsculas
respuesta_lower=$(echo "$respuesta1" | tr '[:upper:]' '[:lower:]')
if [ "$respuesta_lower" = "barça" ] || [ "$respuesta_lower" = "barca" ]; then
echo "Respuesta correcta."
elif [ "$respuesta_lower" = "real madrid" ]; then
echo "Lo siento, la respuesta correcta es: Barça."
else
echo "Respuesta no reconocida. La respuesta correcta es: Barça."
fi
Script para Reiniciar el Equipo (Requiere Root)
Inicia un reinicio programado del sistema en 1 minuto. Importante: Este script debe ejecutarse con privilegios de superusuario (root).
#!/bin/bash
# Script para reiniciar el equipo después de 1 minuto.
# ¡¡¡Requiere privilegios de root para ejecutarse!!!
if [ "$(whoami)" = 'root' ]; then
echo "Iniciando reinicio del sistema en 1 minuto..."
# Programar reinicio para dentro de 1 minuto
shutdown -r +1 "Reinicio programado por script"
echo "Para cancelar el reinicio, ejecute como root: shutdown -c"
else
echo "Error: Este script debe ejecutarse como root."
exit 1
fi
Script para Determinar Tipo de Elemento (Archivo/Directorio)
Verifica si el argumento pasado es un archivo regular, un directorio o si no existe.
#!/bin/bash
# Script que al pasarle un parámetro, determina si es archivo,
# directorio, o si no existe.
if [ $# -lt 1 ]; then
echo "Error: Se requiere un parámetro (nombre de archivo o directorio)."
echo "Uso: $0 <elemento>"
exit 1
fi
elemento="$1"
if [ -d "$elemento" ]; then # Si el parámetro existe y es un directorio.
echo "'$elemento' es un directorio."
elif [ -f "$elemento" ]; then # Si el parámetro existe y es un archivo regular.
echo "'$elemento' es un archivo."
else
# Podría ser un enlace simbólico roto, un socket, etc., o no existir.
echo "'$elemento' no existe o no es un archivo regular ni un directorio."
fi
Script para Mostrar Tamaño de Archivo o Directorio
Muestra el tamaño total de un archivo o directorio pasado como argumento en formato legible por humanos (KB, MB, GB).
#!/bin/bash
# Script que al pasarle un archivo o directorio, devuelve su tamaño.
if [ $# -lt 1 ]; then
echo "Error: Se requiere un parámetro (nombre de archivo o directorio)."
echo "Uso: $0 <elemento>"
exit 1
fi
elemento="$1"
if [ -e "$elemento" ]; then # Verificar si existe (sea archivo, directorio, enlace, etc.)
echo "Calculando el tamaño de '$elemento':"
# du -s: Muestra solo el total. -h: Formato legible.
du -sh "$elemento"
else
echo "Error: '$elemento' no existe."
exit 1
fi
Script para Mostrar Manual de un Comando
Un simple script que actúa como envoltorio (wrapper) para el comando man
, mostrando la página del manual del comando pasado como argumento.
#!/bin/bash
# Script que muestra información de un comando usando 'man'.
if [ $# -lt 1 ]; then
echo "Error: Se requiere el nombre del comando como parámetro."
echo "Uso: $0 <comando>"
exit 1
fi
comando="$1"
echo "Mostrando manual para el comando '$comando':"
man "$comando"
Script para Listar Tipos de Archivo en un Directorio
Dado un directorio como argumento, este script lista todos los elementos dentro de él y utiliza el comando file
para identificar su tipo.
#!/bin/bash
# Script que lista los tipos de archivo dentro de un directorio pasado como parámetro.
if [ $# -lt 1 ]; then
echo "Error: Se requiere un parámetro (nombre de directorio)."
echo "Uso: $0 <directorio>"
exit 1
fi
directorio="$1"
if [ -d "$directorio" ]; then # Si el parámetro existe y es un directorio.
echo "Tipos de archivo en el directorio '$directorio':"
# Usamos find para manejar mejor nombres con espacios y evitar problemas con cd
# -maxdepth 1 para no entrar en subdirectorios, -exec file {} \; para ejecutar file en cada uno
find "$directorio" -maxdepth 1 -exec file {} \;
elif [ -f "$directorio" ]; then # Si es un archivo regular.
echo "Error: '$directorio' es un archivo, no un directorio."
echo "La sintaxis del script es: $0 <nombre_directorio>"
exit 1
else
echo "Error: '$directorio' no existe o no es un directorio válido."
exit 1
fi
Script para Eliminar Archivo con Confirmación
Elimina un archivo pasado como parámetro, pero antes solicita confirmación al usuario.
#!/bin/bash
# Script que elimina un archivo pasado como parámetro, pidiendo confirmación.
if [ $# -lt 1 ]; then
echo "Error: Se requiere un parámetro (nombre de archivo a eliminar)."
echo "Uso: $0 <archivo>"
exit 1
fi
archivo="$1"
if [ ! -f "$archivo" ]; then
echo "Error: El archivo '$archivo' no existe o no es un archivo regular."
exit 1
fi
# Preguntar por confirmación (respuesta por defecto es 'N' No)
read -p "¿Está seguro de que desea eliminar permanentemente el archivo '$archivo'? (s/N): " confirmacion
# Convertir a minúsculas
confirmacion_lower=$(echo "$confirmacion" | tr '[:upper:]' '[:lower:]')
# Verificar si la respuesta es 's'
if [ "$confirmacion_lower" = "s" ]; then
rm -f "$archivo"
if [ $? -eq 0 ]; then
echo "Archivo '$archivo' eliminado correctamente."
else
echo "Error al intentar eliminar el archivo '$archivo'."
exit 1
fi
else
echo "Operación cancelada. El archivo '$archivo' no ha sido eliminado."
fi
Script para Ordenar Contenido de Archivo (A-Z o Z-A)
Lee un archivo de texto y muestra su contenido ordenado alfabéticamente (A-Z) o en orden inverso (Z-A), según se especifique en el segundo argumento.
#!/bin/bash
# Script que ordena el contenido de un archivo alfabéticamente (A-Z) o inversamente (Z-A).
if [ $# -lt 2 ]; then
echo "Error: Se requieren dos parámetros."
echo "Uso: $0 <archivo> <A|Z>"
echo " A: Ordenar A-Z (alfabético)"
echo " Z: Ordenar Z-A (inverso)"
exit 1
fi
archivo="$1"
orden="$2"
if [ ! -f "$archivo" ]; then
echo "Error: El archivo '$archivo' no existe o no es un archivo regular."
exit 1
fi
if [ "$orden" = "A" ]; then
echo "--- Contenido de '$archivo' ordenado A-Z: ---"
# sort -d: considera solo espacios en blanco y caracteres alfanuméricos
sort -d "$archivo"
elif [ "$orden" = "Z" ]; then
echo "--- Contenido de '$archivo' ordenado Z-A: ---"
# sort -r: ordena en reversa
sort -r "$archivo"
else
echo "Error: El segundo parámetro debe ser 'A' (para ordenar A-Z) o 'Z' (para ordenar Z-A)."
exit 1
fi