
Pasar parámetros a un programa es una de las operaciones comunes en cualquier idioma que use.De manera similar, en este artículo, veremos cómo usar el bash incorporado para analizar los parámetros en un script bash. Obtener opciones Características.
introducir
Cada comando que ejecutamos en la terminal tiene un parámetro asociado. Por ejemplo, puede tomar el comando más básico nombrado en Linux df Muestra el uso de espacio en disco del sistema de archivos.Acepta parámetros / banderas como -h
, -i
, --version
etc.
De manera similar, cuando crea un script de shell basado en un caso de uso, es posible que deba procesar el script en función de los parámetros pasados.
Hay dos formas de analizar los parámetros pasados al script bash.
Una es escribir lógica para analizar manualmente los parámetros usando variables especiales [email protected], $ 1, $ 2 … $ N. Otra forma es usar getopts.
Getopts es una función incorporada de bash compatible con POSIX, que acepta parámetros cortos, como -h
, -v
, -b
Esperar.No puedes pasar como --help
, --version
. Si desea analizar opciones largas, existe otra utilidad llamada Obtener selección Este es un programa externo, no el bash integrado.
Cuando utilizo banderas / parámetros, puedo pensar en tres escenarios posibles.
- Un script que se ejecutará incluso si no se pasan parámetros o banderas.
- Un script que acepta banderas pero no toma parámetros.
- Un script que acepta banderas y parámetros relacionados con banderas.
En la siguiente parte, aprenderá cómo crear un script bash que cumpla con los escenarios anteriores.
Consigue ayuda
Puede ejecutar el siguiente comando de ayuda para acceder a la sección de ayuda de getopts.
$ getopts -help
La estructura central de Getopts
Para utilizar getopts, debe comprender cuatro términos importantes.
getopts: getopts optstring name [arg …]
OPTSTRING
-Una lista de caracteres reconocidos como parámetros. ejemplo:-h
,-v
.OPTNAME
-Los parámetros analizados provienen de[email protected]
Será almacenado enOPTNAME
Cambiando. Puede utilizar cualquier nombre como optname.OPTARG
-Si se pasan otros parámetros, se almacenan enOPTARG
Cambiando.OPTIND
-Apunte al índice del siguiente parámetro a procesar.
Cuando pase parámetros al script, se almacenarán en variables [email protected] Getopts obtendrá la lista de parámetros de ella [email protected] usar OPTIND
Y analizarlo.
Deberías estar en OPTSTRING
. El bucle while se usa para recorrer la lista de parámetros pasados y usar OPTIND
getopts tomará los parámetros y los almacenará en OPTNAME
.
Esta Declaración de caso Se utiliza para comprobar si el modo es el mismo que OPTNAME
Y ejecuta su declaración correspondiente.
Ejecutaré el siguiente código a lo largo del artículo. Este es un código simple que es fácil de entender. Primero, creé un archivo llamado «ayuda«Mi secuencia de comandos utiliza sintaxis.
Usé tres parámetros en OPTSTRING; «-s
, -T
, -h
«. nombre de la variable ARG
Es OPTNAME
Usado en el código siguiente.Los parámetros analizados se almacenarán en $ARG
Y use la declaración del caso para tratar de encontrar si el patrón coincide con los parámetros en ARG
Cambiando.
El siguiente script aceptará banderas similares -s
, -h
, -T
También puedes combinar logos como este -shT
.
#!/bin/bash function help(){ echo "USAGE: args.sh -s, -T, -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 función del código anterior se explicará en detalle en la siguiente sección.
No se pasaron parámetros
El comportamiento predeterminado de getopts es que si no se pasan parámetros, no arrojará un mensaje de error y saldrá con un código de retorno. cero.
En algunos casos, el script no debe ejecutarse cuando no se pasan parámetros. En este caso, puede usar una declaración condicional para verificar la longitud del parámetro pasado ([email protected]
) Es cero. Si no se pasa ningún parámetro, el script fallará.
Eche un vistazo al código a continuación.Guardo el parámetro pasado en una variable PASSED_ARGS
Y compruebe su longitud.Si la longitud es PASSED_ARGS
No es cero, entonces while loop
El uso de getopts se ejecutará, de lo contrario help
La función se ejecutará y el script se cerrará con un 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 utilizar la siguiente línea única para evaluar los parámetros pasados.
[[ ${#PASSED_ARGS} -ne 0 ]] && echo "Arguments stored in [email protected] = [email protected]" || { echo "No argument passed"; help; exit 1; }
Parámetros marcados y sus parámetros admitidos
Puedes simplemente pasar la bandera, por ejemplo -h
o -s
Al guión o logotipo y parámetros relacionados como -T
Lo.Deberías agregar un colon (:) En el identificador del logotipo (-T
) Haga que la bandera acepte parámetros.
En el siguiente código, puede ver que agregué dos puntos (:
) Después del identificador T
. Esto significa que cuando pase -T
Marque el guión, debería pasar un parámetro adicional a través de él.
while getopts ":sT:h" ARG; do
Cuando el parámetro se pasa a la bandera, se almacenará en una variable $OPTARG
Debe 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 parámetros a la vez.
Manejo de errores
Puede haber casos en los que los errores de paso de parámetros sean incorrectos y el script debería arrojar algunos errores.
De forma predeterminada, cuando la bandera pasada no está presente, getopts arrojará un mensaje de error OPTSTRING
O si no pasa otros parámetros a la bandera.Agrega uno colon Al Principio OPTSTRING
Se suprimirá el mensaje de error predeterminado.
Eliminemos los dos puntos y ejecutemos el script nuevamente.Estoy pasando por -x
Como primer parámetro inexistente OPTSTRING
. En segundo lugar, -T
Necesito un parámetro adicional que no proporcioné. En ambos casos, me arroja un error.
Ahora puede cancelar el mensaje de error predeterminado e imprimir su propio mensaje de error. Verifique el siguiente patrón de la declaración del caso.
- colon(:) -> Si no se pasan parámetros adicionales
OPTARG
Establezca dos puntos y podrá escribir lógica para imprimir mensajes de error. - ? -> Cuando no hay un parámetro
OPTSTRING
pasar por,OPTNAME
Se establecerá en «?
«.
🙂 echo "argument missing" ;; ?) echo "Something is wrong" ;;
Uso de Shift y OPTIND
Si usa algún script existente escrito con getopts, verá esta declaración más adelante while
Anillo.
shift "$((OPTIND-1))"
Cuando se activa el guión, OPTIND
establecer como 1. Esta OPTIND
Apunta a la ubicación del siguiente parámetro procesado por getopts.
La declaración anterior eliminará todos los datos generados por getopts y $1
No se establecerá como el primer parámetro no opcional que se pasa al script.
en conclusión
En este artículo, hemos aprendido cómo usar la función getopts para analizar parámetros en un script bash. Getopts solo admite parámetros de formato corto y no puede pasar parámetros largos.
Al principio, usar getopts puede parecer complicado, pero si comprende la estructura principal, entonces se vuelve fácil.