Utilizar 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 entender lo que está sucediendo.
¿Qué es getopt?
getopt
se utiliza para dividir (analizar) las opciones en las líneas de comando para facilitar el análisis mediante procedimientos de shell y para buscar opciones legales. Utiliza las getopt(3)
rutinas GNU para hacer esto.
getopt
puede tener los siguientes tipos de opciones.
- Opciones sin valor
- opciones de par clave-valor
Nota: En este documento, durante la explicación de la sintaxis:
- Cualquier cosa dentro de [] 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.
- 'h' es una opción sin valor.
- 'v:' implica que la opción -v tiene valor y es una opción obligatoria. ':' significa que tiene un valor.
- '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 el valor.
Sintaxis: Segunda forma
getopt [getopt_options] [--] [optstring] [parameters]
Aquí después de getopt se divide en cinco partes
- El comando en sí, es decir, getopt
- Las getopt_options, describe cómo analizar los argumentos. opciones largas de un solo guion, opciones de doble guion.
- -, separa las opciones getopt 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 primera sintaxis del 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
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
Sintaxis: Tercera forma
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
Aquí después de getopt se divide en cinco partes
- El comando en sí, es decir, getopt
- Las getopt_options, describe cómo analizar los argumentos. opciones largas de un solo guion, opciones de doble guion.
- Las opciones cortas es decir -o u --opciones. Al igual que la primera sintaxis del formulario, pero con la opción "-o" y antes del "-" (guión doble).
- -, separa las opciones getopt 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
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 getopt
Opción: -l o --longoptions
El comando getopt de medios debe permitir que se reconozcan las opciones de varios caracteres. Las opciones múltiples están separadas por comas.
Por ejemplo, --name=Karthik
es una opción larga enviada en línea de comando. En getopt, el uso de opciones largas es como
getopt "name:,version" "--name=Karthik"
Como nombre: se especifica, la opción debe contener un valor
Opción: -a o --alternativa
El comando getopt significa que la opción larga debe tener un solo guión '-' en lugar de un guión doble '-'.
Ejemplo, en lugar de --name=Karthik
usted podría usar solo-name=Karthik
getopt "name:,version" "-name=Karthik"
Un ejemplo completo de script 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 script:
# 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
-s
, lo convierten en un argumento posicional:./myscript 45 anystring
.