Está en la página 1de 2

Orden getopts

Se utiliza para pasar opciones en línea de órdenes a un shell script. Por ejemplo, la orden “ls”
admite, entre otras, las opciones “-l” y “-a”. En el caso del script para nuestra PDU deberá
aceptar las opciones “–a” (para apagar o encender todas las salidas) o “–f inicial”, “–t final”,
por ejemplo.

Sintaxis
getopts opciones variable

• Opciones: lista de opciones que puede aceptar el script.


• Variable: nombre de la variable que se utiliza para leer cada vez una de las opciones.

Variables de entorno

Utiliza dos variables de entorno:

• OPTARG: contiene el valor del argumento para una opción determinada. Por ejemplo,
en el script final de la práctica 1, al indicar la opción “–f inicial”, el valor “inicial” se
almacenaría en OPTARG.
• OPTIND: contiene el índice de la siguiente opción de la línea de órdenes.

Ejemplo 1: construcción básica

Habitualmente getopts se procesa en un bucle para analizar todas las opciones de entrada.
El análisis suele realizarse mediante la estructura case. Veamos un ejemplo donde el script
acepta dos parámetros de entrada: “-a” sin argumentos y “-f inicial” con el argumento inicial.

Por ejemplo, ejecutaremos:


./ejemp.sh –a –f 3

El script de ejemplo podría ser:


# echo ejemp.sh
#!/bin/bash
while getopts “af:” opt
do
case $opt in
1. … procesar aquí la orden o preparar las variables
adecuadas para procesarla después … ;;
f) ini = $OPTARG;;
# almacenamos el valor 3 que acompaña a “-f 3” en la
# variable “ini”
esac
done

A continuación de la palabra getopts hemos indicado las opciones que acepta el script: “af”.
Cada una de las opciones que lleven argumento, en el ejemplo la única es “f”, deben ir seguidas
del carácter “:”. Como variable para procesar las opciones se ha elegido “opt”, será el nombre
que decida el programador.

Ejemplo 2: mensajes de error personalizados

Si introducimos opciones erróneas para las que el script no tiene una entrada definida, en
nuestro ejemplo podría ser la opción “–k”, o que no lleven los argumentos requeridos, el
sistema nos dará un mensaje de error.

Ejemplos de uso:

1. #./ejemp.sh –k
./ejemp.sh –k: illegal option – k

2. ./ejemp.sh –f
./ejemp.sh option requires an argument -- f

Si queremos que nuestro script genere mensajes de error personalizados debemos añadir al
bloque case nuevas entradas. Tenemos dos posibilidades:

• Utilizar el mismo mensaje de error, tanto si el parámetro introducido no existe, como


si el parámetro es correcto pero requiere argumentos y no los hemos puesto. Esto
puede conseguirse añadiendo al case una entrada *)
*) echo “ ERROR: entrada inválida; exit 1;;

• Utilizar dos mensajes de error, uno para cada uno de los casos mencionados. Para ello
debemos añadir “:” al comienzo de la lista de opciones indicada a getopts (se ha
marcado en rojo en el ejemplo):
while getopts “:af:” opt

En este caso:
• Si una opción es desconocida getops devuelve “?”.
• Si una opción espera un argumento y no lo introducimos getops devuelve
“:”.
Esto nos permitirá devolver distintos mensajes de error añadiendo en el case:
\?) echo “ ERROR - Opción desconocida: $OPTARG; exit 1;;
:) echo “ ERROR - La opción $OPTARG requiere un argumento
exit 1;;

Ejemplo de uso:
#./ejemp.sh –k
ERROR - Opción desconocida: -k

#./ejemp.sh –f
ERROR - La opción -f requiere un argumento

Además como puede verse al añadir “:” se elimina el mensaje de error del sistema y al introducir
una opción incorrecta queda almacenada en la variable OPTARG con lo que nuestro mensaje de
error puede referenciarla fácilmente.

También podría gustarte