Este es uno de los capítulos del tutorial Scripts en Bash. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
Hasta para el script mas sencillo y simplón conviene pedir argumentos y crear la correspondiente ayuda. Inicialmente, puedes pensar que no hará falta, que será terriblemente sencillo, que no vas a necesitar nada mas. Sin embargo, te puedo asegurar que te engañas. Si se trata de un script que utilizas con mas o menos frecuencia, terminarás por añadir mas funcionalidades. Cada vez mas y mas funcionalidades, y llegará el momento que eches en falta esa ayuda. Y es que tarde o temprano, dejarás de utilizar ese script, por la razón que sea, y el día que lo quieras volver a utilizar será un auténtico drama, porque no sabrás ni para que sirve ese script, y por supuesto como utilizarlo. Dicho esto, te cuento como crear una ayuda para tus scripts.
Así, en este nuevo capítulo del tutorial sobre scripts en Bash, te cuento como puedes hacer un script apañado. Un script que te muestre una ayuda cuando se la solicites, o simplemente cuando te equivoques al introducir los parámetros. Una ayuda que te indique, tanto para que sirve ese script como que parámetros le tienes que pasar para que funcione de forma correcta. Como te digo, una ayuda para tus scripts.
Una ayuda para tus scripts
En el capítulo 1 del tutorial sobre scripts en Bash, titulado variables en Bash, te comenté sobre unas variables especiales. Son precisamente estas variables especiales, las que hoy vas a sacar de paseo.
Por recordar estas variables especiales, indicarte al menos las siguientes,
$0
representa el nombre del script$1
–$9
los primeros nueve argumentos que se pasan a un script en Bash$#
el número de argumentos que se pasan a un script$@
todos los argumentos que se han pasado al script
¿Como mostrar la ayuda?
Normalmente para mostrar la ayuda, se utiliza -h
o --help
. Así una solución para mostrar la ayuda sería la siguiente,
#!/bin/bash
for arg in "$@"
do
if [ "$arg" == "--help" ] || [ "$arg" == "-h" ]
then
echo "Help argument detected."
fi
done
Pero y ¿que hacer con el resto de parámetros?¿Como puedes trabajar con el resto de parámetros que le quieres pasar a tu script?
Crear la ayuda
Para crear la ayuda, mi recomendación es que crees una función que cumpla con este cometido. Una función que sea sencilla de mantener y donde se muestre tanto para que se utiliza el script como los parámetros que hay que pasarle.
Así por ejemplo para crear una ayuda para tus scripts, puedes implementar una función como la que sigue,
function ayuda(){
echo "Este script se utiliza para lo que sea"
echo
echo "Uso: ./script.sh [-o1 opcion1][-o2 opcion2] -03 opcion3"
echo
echo "-o1 es la opción número 1. Es opcional"
echo "-o2 es la opción número 2. Es opcional"
echo "-03 es la opción número 3. Es obligatoria"
echo
}
En este ejemplo he considerado dos opciones. Una de las opciones es obligatoria, de forma que en el caso de que no se introduzca se generará un error, mientras que las otras dos opciones no son obligatorias. De esta forma el usuario del script puede utilizarlas o no según considere.
Objeto de tu script
Al igual que has implementado una función para la ayuda, también es interesante que generes una función para las distintas operaciones que va a realizar tu script, vamos el objeto para el que has desarrollado tu script. Esto te va a facilitar no solo mantener el script con vista a una fugura modificación, sino que además hará el script bastante mas legible.
Gestionando parámetros
Una vez ya tienes preparada tu ayuda, y las distintas funciones que va a realizar tu script, tienes que lidiar con los distintos parámetros que le pases a tu script. Así para el ejemplo en cuestión lo puedes hacer de la siguiente forma,
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-o1|--opcion1)
OPCION1="$2"
shift # past argument
shift # past value
;;
-o2|--opcion2)
OPCION2="$2"
shift # past argument
shift # past value
;;
-o3|--opcion3)
OPCION3="$2"
shift # past argument
shift # past value
;;
-h|--help)
ayuda
exit
;;
*)
echo "ERROR: parámetro desconocido"
ayuda
exit 1
;;
esac
done
if [ "$OPCION3" == "" ]
then
ayuda
exit
fi
Falta ahora una breve explicación. Con el bucle while
que viste en el capítulo 3 de este tutorial, bucles en Bash, recorres todos los parámetros que le has pasado al script.
Con el comando shift
eliminas argumentos de la lista de argumentos. De esta forma cada vez que utilizas shift
el argumento $2
pasa a ser el $1
y así sucesivamente. En este ejemplo, como utilizas dos shift
uno a continuación de otro, la operación es que el $3
pasa a ser el $1
y el $4
el $2
, y de esta manera consumes todos los argumentos.
Conclusión
Esta es una solución, sencilla pero funcional tanto para extraer todo el potencial de los argumentos, como para mostrar la ayuda. Como te puedes imaginar, no es la única solución, así, que si tienes alguna propuesta diferente, no dudes en compartirla.
Más información,