Pasar argumentos a un programa es una de las operaciones comunes en cualquier idioma que utilice. De manera similar, en este artículo, veremos cómo analizar argumentos en scripts bash utilizando la función integrada getopts bash en Linux.
Introducción
Cada comando que ejecutamos en la terminal tiene un argumento asociado. Por ejemplo, puede tomar el comando más básico en Linux llamado df que muestra el uso del espacio en disco del sistema de archivos. Acepta argumentos/marcas como -h
, -i
, --version
, etc.
Similar a esto, cuando está creando secuencias de comandos de shell según el caso de uso, es posible que deba procesar la secuencia de comandos según el argumento pasado.
Hay dos formas de analizar los argumentos pasados al script en bash.
Uno es escribir la lógica para analizar los argumentos manualmente usando las variables especiales [email protected], $1, $2… $N. Otra forma sería usar getopts .
Getopts es una función incorporada de bash compatible con POSIX que acepta argumentos cortos como -h
, -v
, -b
, etc. No puede pasar argumentos largos como --help
, --version
. Si desea analizar opciones largas, hay otra utilidad llamada getopt que es un programa externo y no bash incorporado.
Hay tres escenarios posibles en los que puedo pensar cuando trabajo con banderas/argumentos.
- La secuencia de comandos que se ejecuta incluso cuando no se pasan argumentos ni indicadores.
- El script que acepta banderas pero sin argumentos.
- La secuencia de comandos que acepta banderas y argumentos asociados para la bandera.
Aprenderá cómo crear un script bash que satisfaga los escenarios anteriores en las próximas secciones.
Obtención de ayuda
Puede ejecutar el siguiente comando de ayuda para acceder a la sección de ayuda de getopts.
$ getopts -help
Construcción central de Getopts
Hay cuatro términos importantes que debe conocer para poder trabajar con getopts.
getopts: getopts optstring name [arg …]
OPTSTRING
- La lista de caracteres que se reconocen como argumentos. Ejemplo:-h
,-v
.OPTNAME
- El argumento analizado de[email protected]
se almacenará en elOPTNAME
variable. Puede usar cualquier nombre como optname.OPTARG
- Si se pasan argumentos adicionales, eso se almacena enOPTARG
variables.OPTIND
- Índice que apunta al siguiente argumento a procesar.
Cuando pase los argumentos al script, se almacenarán en la variable [email protected] Getopts obtendrá la lista de argumentos de [email protected] use OPTIND
y analizarlo.
Debe especificar la lista de argumentos reconocidos en OPTSTRING
. Mientras que el bucle se usa para iterar sobre la lista de argumentos pasados y usar OPTIND
, getopts obtendrá el argumento y lo almacenará en OPTNAME
.
La declaración de caso se utiliza para comprobar si el patrón coincide con OPTNAME
y ejecute su sentencia correspondiente.
Voy a ejecutar el siguiente código a lo largo del artículo. Este es un código simple de entender. Primero he creado una función llamada "ayuda " donde hay una sintaxis de uso para mi script.
Estoy usando tres argumentos en OPTSTRING; "-s
, -T
, -h
". Variable llamada ARG
es el OPTNAME
utilizado en el siguiente código. El argumento analizado se almacenará en $ARG
y usando la declaración de caso, intentará encontrar si el patrón coincide con el argumento en el ARG
variables.
El siguiente script aceptará indicadores como -s
, -h
, -T
y también puedes combinar banderas como -shT
.
#!/bin/bash function help(){ echo "USAGE: args.sh -s, -T <arg>, -h" } while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing" ;; \?) echo "Something is wrong" ;; esac done shift "$((OPTIND-1))"
La funcionalidad del código anterior se explicará en detalle en la próxima sección.
Ningún argumento aprobado
El comportamiento predeterminado de getopts es que si no se pasa ningún argumento, no arrojará un mensaje de error y saldrá con el código de retorno cero .
En algunos casos, el script no debería ejecutarse cuando no se pasa ningún argumento. En ese caso, puede usar declaraciones condicionales para verificar la longitud de los argumentos pasados ([email protected]
) es cero o no. Si no se pasan argumentos, el script fallará.
Echa un vistazo al siguiente código. Estoy almacenando los argumentos pasados a la variable PASSED_ARGS
y comprobando la longitud de la misma. Si la longitud de PASSED_ARGS
no es cero, entonces while loop
con getopts se ejecutará, de lo contrario help
la función se ejecutará y el script se cerrará con el código de retorno 1 .
[email protected] if [[ ${#PASSED_ARGS} -ne 0 ]] then while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing for $ARG" ;; \?) echo "Something is wrong" ;; esac done else help exit 1 fi shift "$((OPTIND-1))"
También puede usar la siguiente línea para evaluar los argumentos pasados.
[[ ${#PASSED_ARGS} -ne 0 ]] && echo "Arguments stored in \[email protected] = [email protected]" || { echo "No argument passed"; help; exit 1; }
Argumentos con banderas y sus argumentos compatibles
Puedes simplemente pasar banderas como -h
o -s
a la secuencia de comandos o banderas y argumento asociado como -T
lo. Debe agregar dos puntos (-T
) para hacer que la bandera acepte el argumento.
En el siguiente código, puede ver que he agregado dos puntos (:
) después del identificador T
. Significa cuando paso el -T
marca al script, debería pasarle un argumento adicional.
while getopts ":sT:h" ARG; do
Cuando se pasa un argumento a la bandera, se almacenará en la variable $OPTARG
. Tienes que escribir lógica para capturar la variable y procesarla en consecuencia. Copie y ejecute el mismo código de la sección anterior.
T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;;
También puede combinar y ejecutar varios argumentos a la vez.
Manejo de errores
Puede haber situaciones en las que los argumentos se pasen incorrectamente y el script arroje algunos errores.
De forma predeterminada, getopts arrojará un mensaje de error cuando una marca pasada no esté en OPTSTRING
o si no pasa argumentos adicionales a la bandera. Adición de dos puntos al comienzo de OPTSTRING
suprimirá los mensajes de error predeterminados.
Eliminemos los dos puntos y ejecutemos el script nuevamente. Estoy pasando -x
como el primer argumento que no está presente en OPTSTRING
. En segundo lugar, -T
requiere un argumento adicional que no proporcioné En ambos casos me arroja el error.
Ahora, puede suprimir los mensajes de error predeterminados e imprimir sus propios mensajes de error. Eche un vistazo a los siguientes patrones de la declaración del caso.
- Dos puntos (:) -> Si no se pasa ningún argumento adicional
OPTARG
se establecerá en dos puntos y puede escribir lógica para imprimir mensajes de error. - \? -> Cuando un argumento que no está en
OPTSTRING
se pasa,OPTNAME
se establecerá en "?
".
:) echo "argument missing" ;; \?) echo "Something is wrong" ;;
Uso de Shift y OPTIND
Si toma cualquier secuencia de comandos existente escrita con getopts, verá esta declaración después de while
bucle.
shift "$((OPTIND-1))"
Cuando se activa el script, OPTIND
está establecido en 1 . El OPTIND
apunta a la posición del siguiente argumento a ser procesado por getopts.
La declaración anterior eliminará todas las opciones analizadas por getopts y $1
no se establecerá en el primer argumento no opcional pasado al script.
Conclusión
En este artículo, hemos visto cómo analizar argumentos en scripts bash usando la función getopts. Getopts solo admite una forma breve de argumentos y no puede pasar argumentos largos.
Al principio, puede parecer complicado trabajar con getopts. Pero si entiendes el concepto central, entonces se vuelve fácil.
Lectura similar:
- Cómo analizar archivos CSV en Bash Scripts en Linux
Guías de secuencias de comandos de Bash:
- Cómo crear cuadros de diálogo GUI en secuencias de comandos Bash con Zenity en Linux y Unix
- Secuencias de comandos de Bash:declaración de caso
- Secuencias de comandos de Bash:declaraciones condicionales
- Bash Scripting:manipulación de cadenas
- Secuencias de comandos de Bash:comando Printf explicado con ejemplos
- Bash Scripting:matriz indexada explicada con ejemplos
- Secuencias de comandos de Bash:matriz asociativa explicada con ejemplos
- Secuencias de comandos de Bash:bucle For explicado con ejemplos
- Secuencias de comandos de Bash:ciclo while y till explicado con ejemplos
- Redireccionamiento de Bash explicado con ejemplos
- Secuencias de comandos de Bash:variables explicadas con ejemplos
- Bash Scripting:funciones explicadas con ejemplos
- Comando Bash Echo explicado con ejemplos en Linux
- Tutorial de Bash Heredoc para principiantes