Herramientas Personales
Usted está aquí: Inicio Cursos Curso de administración de servidores GNU/Linux 2015 Unidades Unidad 2. Ejemplo de script comentado (numrep-v6.sh)

Unidad 2. Ejemplo de script comentado (numrep-v6.sh)

por Juan Chico, Jorge Última modificación 11/04/2014 12:30

numrep-v6.sh — text/x-sh, 3Kb

Contenido del Archivo

#!/bin/bash
# numrep-v6.sh: cuenta repeticiones (comentado)
# Jorge Juan <jjchico@gmail.com>. 2013.

# Define la variable "prog" con el nombre del programa. "$0" es la ruta
# completa del ejecutable (ej. /usr/local/bin/numrep-v6.sh). "basename"
# extrael del nombre la última parte de la ruta, esto es, "numrep-v6.sh".
# El nombre se empleará en los mensajes de error. De esta forma, aunque en el
# futuro cambiemos el nombre del script a "numrep.sh" por ejemplo, el script
# siempre sabe con qué nombre fue llamado.
prog=`basename $0`
# Define el número de líneas a mostrar por defecto
lines=10

# Este bloque analiza las opciones que se pasan al programa. Las opciones son
# parámetros que comienzan con "-", por ejemplo "numrep-v6.sh -n 15 gpl.txt".
# "$1" contiene el primer parámetro. El bucle "while" comprueba si el parámetro
# es una opción, para ello mira si corresponde a la expresión regular "^-", que
# significa "pricipio de línea (^) seguido de guión (-)". Si es una opción, el
# "case" determina qué opción es y actúa en consecuencia.
while [[ "$1" =~ ^- ]]; do
    case "$1" in
        # Si la opción es "-h" muestra un mensaje de ayuda y temina el script.
        -h) echo "$prog: cuenta repeticiones de palabras"
            echo "Uso: $prog [-h] [-n N] <archivo>"
            exit 1
            ;;
        # Si la opción es "-n", define un nuevo número de líneas a mostrar. El
        # numero dado por el usuario debe estar en el segundo parámetro pasado
        # al script, esto es, "$2". El "shift" elimina un parámetro de la lista,
        # esto es, $1 pasa a ser $2, $2 es $3, etc.
        -n) lines=$2; shift
            ;;
        # Cualquier otra opción (* significa cualquier carácter) no es recono-
        # cida y se mostrará un mensaje de error.
        -*) echo "$prog: opción desconocida."
            echo "Pruebe: '$prog -h' para ayuda."
            exit 1
            ;;
    esac
    # Tras procesar cada opción, se desplazan las opciones con "shift" para que
    # al repetir el bucle se compruebe la siguiente opción.
    shift
done

# "$*" contiene la lista de parámetros restantes. Si la lista está vacía,
# ejecutamos "cat" para leer de la entrada estándar. Si la lista no está
# vacía, ejecutamos cat pero pasándole el resto de parámetros dados al
# script ("$@") que serán los archivos a leer.
# El resto es una cadena de filtros. La salida de un filtro (comando) se pasa
# al siguiente filtro con "|". Cada comando hace una tarea específica (más
# detalles en el manual de cada comando).
if [ "X$*" == "X" ]
then
    cat
else
    cat "$@"            # tr: convierte todos los espacios en nuevas líneas
fi |                    # dejando una sóla palabra por línea.
tr -sc A-Za-z '\012' |  # sort: ordena todas las líneas dejando juntas palabras
sort |                  # iguales.
uniq -c |               # uniq: une líneas iguales y cuenta repeticiones.
sort -nr |              # sort: ordena de mayor a menor numéricamente.
head -$lines            # head: muestra sólo $lines líneas.
Acciones de Documento