Tutoriales

Utilice getopts para analizar los parámetros en el script Bash

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, --versionetc.

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, -bEsperar.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 …]
  1. OPTSTRING -Una lista de caracteres reconocidos como parámetros. ejemplo: -h, -v.
  2. OPTNAME -Los parámetros analizados provienen de [email protected] Será almacenado en OPTNAME Cambiando. Puede utilizar cualquier nombre como optname.
  3. OPTARG -Si se pasan otros parámetros, se almacenan en OPTARG Cambiando.
  4. 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.

Comportamiento por defecto

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))"
Sin error de parámetro
Sin error de parámetro

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 $OPTARGDebe 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" ;;
Parámetros marcados
Parámetros marcados

También puede combinar y ejecutar varios parámetros a la vez.

Ejecutar con múltiples parámetros
Ejecutar con múltiples parámetros

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.

Mensaje de error predeterminado
Mensaje de error predeterminado

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" ;;
Mensaje de error definido por el usuario
Mensaje de error definido por el usuario

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.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba