GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Scripting:analizar argumentos en Bash Scripts usando getopts

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 …]
  1. OPTSTRING - La lista de caracteres que se reconocen como argumentos. Ejemplo:-h , -v .
  2. OPTNAME - El argumento analizado de [email protected] se almacenará en el OPTNAME variable. Puede usar cualquier nombre como optname.
  3. OPTARG - Si se pasan argumentos adicionales, eso se almacena en OPTARG variables.
  4. 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 (: ) después del identificador de bandera (-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

Linux
  1. Usando Bash para la automatización

  2. Agregar argumentos y opciones a sus scripts de Bash

  3. ¿Proporcionar dos argumentos a una opción usando Getopts?

  4. automatizar la sesión de telnet usando scripts bash

  5. ¿Cómo analizar encabezados HTTP usando Bash?

Shell Scripting para principiantes:cómo escribir Bash Scripts en Linux

Script Bash (II)

Usando el comando Dirname de Linux en Bash Scripts

Bash Beginner Series #5:Uso de operadores aritméticos en Bash Scripting

Bash Beginner Series #3:Pasando Argumentos a Bash Scripts

Creando clases y objetos usando bash scripting