5.9.- Análisis de las opciones de un script con getopts

El comando interno getopts permite a un script analizar las opciones que le han sido pasadas como argumento.

Sintaxis

Cada llamada a getopts analiza la opción siguiente de la línea de comandos. Para verificar la validez de cada una de las opciones, hay que llamar getopts desde un bucle.

Definición de una opción

Para getopts, una opción se compone de una carácter precedido por un signo «+» o ««.

Ejemplo

Ejecutando el script:

«-c» y «+c» son las opciones, mientras que «wordpress» es un argumento; una opción puede funcionar sola o estar asociada a un argumento.

El script gestusuario (listado arriba) permite archivar y restaurar cuentas de usuario. Estas son opciones sin argumento. Las opciones -u y -g permiten especificar la lista de usuarios y la lista de grupos a tratar. Tienen que estar seguidas de un argumento.

Llamando al script con opciones válidas

Opciones inválidas

Cuando getopts detecta una opción inválida, la variable opcion se inicializa con el carácter «?» y un mensaje de error se reflejará en la pantalla. Seguidamente las siguientes opciones se analizarán.

Gestión de errores

Si colocamos el carácter «:» en la primera posición de la lista de opciones a tratar, los errores se generarán de forma diferente en el caso de una opción inválida:

  • getopts no mostrará un mensaje de error;
  • la variable OPTARG se inicializará con el valor de la opción incorrecta.

Veamos el listado del código reescrito:

Ejecutamos el script con las modificaciones.

En esta línea, el «?» tiene que protegerse para que no sea interpretado por el shell.

Opción válida sin argumentos

Cuando el argumento de una opción está ausente, la variable opcion se inicializa con el carácter «:»  y OPTARG contiene el valor de la opción involucrada.

Ejemplo

Vemos en este caso, la estructura de control case que trata el caso del argumento ausente:

Tras añadir una nueva opción al comando case la ejecución será:

Las opciones se almacenan en los parámetros posicionales ($1, $2, …). Una vez que se han analizado, es posible deshacerse de ellos con el comando shift. Esto es interesante si quedan argumentos a tratar tras las opciones.

Ejemplo

Añadiremos las líneas a nuestro script detrás del bucle while para permitirnos retirar las opciones de la lista de argumentos (shift $((OPTIND-1))).

  • Ensaya con lo aprendido en esta sección.