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

Entradas relacionadas: