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.