in

shell: un ejemplo de cómo usar getopts en bash

apple touch icon@2

Usar getopt

¿Por qué getopt?

Analizar argumentos elaborados de la línea de comandos para evitar confusiones y aclarar las opciones que estamos analizando para que el lector de los comandos pueda comprender lo que está sucediendo.

¿Qué es getopt?

getopt se utiliza para dividir (analizar) opciones en líneas de comando para facilitar el análisis mediante procedimientos de shell y para verificar opciones legales. Utiliza GNU getopt(3) rutinas para hacer esto.

getopt puede tener los siguientes tipos de opciones.

  1. Opciones sin valor
  2. opciones de pares clave-valor

Nota: En este documento, durante la explicación de la sintaxis:

  • Cualquier cosa dentro [ ] es un parámetro opcional en la sintaxis / ejemplos.
  • es un marcador de posición, lo que significa que debe sustituirse por un valor real.

CÓMO UTILIZAR getopt?

Sintaxis: Primera forma

getopt optstring parameters

Ejemplos:

# This is correct
getopt "hv:t::" "-v 123 -t123"  
getopt "hv:t::" "-v123 -t123"  # -v and 123 doesn't have whitespace

# -h takes no value.
getopt "hv:t::" "-h -v123"


# This is wrong. after -t can't have whitespace.
# Only optional params cannot have whitespace between key and value
getopt "hv:t::" "-v 123 -t 123"

# Multiple arguments that takes value.
getopt "h:v:t::g::" "-h abc -v 123 -t21"

# Multiple arguments without value
# All of these are correct
getopt "hvt" "-htv"
getopt "hvt" "-h -t -v"
getopt "hvt" "-tv -h"

Aquí h, v, t son las opciones y -h -v -t es cómo se deben dar las opciones en la línea de comandos.

  1. ‘h’ es una opción sin valor.
  2. ‘v:’ implica que la opción -v tiene valor y es una opción obligatoria. ‘:’ significa que tiene un valor.
  3. ‘t ::’ implica que la opción -t tiene valor pero es opcional. ‘::’ significa opcional.

En el parámetro opcional, el valor no puede tener separación de espacios en blanco con la opción. Entonces, en el ejemplo «-t123», -t es la opción 123 es valor.

Sintaxis: segunda forma

getopt [getopt_options] [--] [optstring] [parameters]

A continuación, getopt se divide en cinco partes

  • El comando en sí, es decir, getopt
  • Getopt_options, describe cómo analizar los argumentos. opciones largas de un solo guión, opciones de doble guión.
  • -, separa getopt_options de las opciones que desea analizar y las opciones cortas permitidas
  • Las opciones cortas se toman inmediatamente después de que se encuentra. Al igual que la sintaxis del primer formulario.
  • Los parámetros, estas son las opciones que ha pasado al programa. Las opciones que desea analizar y obtener los valores reales establecidos en ellas.

Ejemplos de

getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"

Sintaxis: Tercera forma

getopt [getopt_options] [-o options] [--] [optstring] [parameters]

A continuación, getopt se divide en cinco partes

  • El comando en sí, es decir, getopt
  • Getopt_options, describe cómo analizar los argumentos. opciones largas de un solo guión, opciones de doble guión.
  • Las opciones cortas, es decir, -o o –options. Al igual que la sintaxis del primer formulario pero con la opción «-o» y antes del «-» (guión doble).
  • -, separa getopt_options de las opciones que desea analizar y las opciones cortas permitidas
  • Los parámetros, estas son las opciones que ha pasado al programa. Las opciones que desea analizar y obtener los valores reales establecidos en ellas.

Ejemplos de

getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"

GETOPT_OPTIONS

getopt_options cambia la forma en que se analizan los parámetros de la línea de comandos.

A continuación se muestran algunas de las opciones de getopt

Opción: -lo –longoptions

Significa que el comando getopt debería permitir que se reconozcan opciones de varios caracteres. Las opciones múltiples están separadas por comas.

Por ejemplo, --name=Karthik es una opción larga enviada en la línea de comandos. En getopt, el uso de opciones largas es como

getopt "name:,version" "--name=Karthik"

Dado que se especifica name:, la opción debe contener un valor

Opción: -a o –alternative

Significa que el comando getopt debería permitir que la opción larga tenga un solo guión ‘-‘ en lugar de dos guiones ‘-‘.

Ejemplo, en lugar de --name=Karthik podrías usar solo -name=Karthik

getopt "name:,version" "-name=Karthik"

Un ejemplo de script completo con el código:

#!/bin/bash

# filename: commandLine.sh
# author: @theBuzzyCoder

showHelp() {
# `cat << EOF` This means that cat should stop reading when EOF is detected
cat << EOF  
Usage: ./installer -v <espo-version> [-hrV]
Install Pre-requisites for EspoCRM with docker in Development mode

-h, -help,          --help                  Display help

-v, -espo-version,  --espo-version          Set and Download specific version of EspoCRM

-r, -rebuild,       --rebuild               Rebuild php vendor directory using composer and compiled css using grunt

-V, -verbose,       --verbose               Run script in verbose mode. Will print out each step of execution.

EOF
# EOF is found above and hence cat command stops reading. This is equivalent to echo but much neater when printing out.
}


export version=0
export verbose=0
export rebuilt=0

# $@ is all command line parameters passed to the script.
# -o is for short options like -v
# -l is for long options with double dash like --version
# the comma separates different long options
# -a is for long options with single dash like -version
options=$(getopt -l "help,version:,verbose,rebuild,dryrun" -o "hv:Vrd" -a -- "$@")

# set --:
# If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters 
# are set to the arguments, even if some of them begin with a ‘-’.
eval set -- "$options"

while true
do
case $1 in
-h|--help) 
    showHelp
    exit 0
    ;;
-v|--version) 
    shift
    export version=$1
    ;;
-V|--verbose)
    export verbose=1
    set -xv  # Set xtrace and verbose mode.
    ;;
-r|--rebuild)
    export rebuild=1
    ;;
--)
    shift
    break;;
esac
shift
done

Ejecutando este archivo de secuencia de comandos:

# With short options grouped together and long option
# With double dash '--version'

bash commandLine.sh --version=1.0 -rV
# With short options grouped together and long option
# With single dash '-version'

bash commandLine.sh -version=1.0 -rV

# OR with short option that takes value, value separated by whitespace
# by key

bash commandLine.sh -v 1.0 -rV

# OR with short option that takes value, value without whitespace
# separation from key.

bash commandLine.sh -v1.0 -rV

# OR Separating individual short options

bash commandLine.sh -v1.0 -r -V

Deja una respuesta

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

HTML: formato

gfg 200x200 min

Aplicaciones de la estructura de datos del montón