
Usar getopt
¿Por qué rematado?
Analice argumentos elaborados de línea de comandos para evitar confusiones y aclare las opciones que analizamos para que el lector de comandos pueda entender lo que está sucediendo.
¿Qué está rematado?
getopt
se utiliza para dividir (analizar) las opciones en las líneas de comando para facilitar el análisis mediante los procedimientos de shell y para verificar las opciones legales. Usar GNU getopt(3)
rutinas para hacerlo.
getopt
Puede tener los siguientes tipos de opciones.
- opciones sin valor
- Opciones de par clave-valor
Nota: En este documento al explicar la sintaxis:
- algo adentro [ ] es un parámetro opcional en la sintaxis/ejemplos.
- es un marcador de posición, lo que significa que debe reemplazarse con 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 especificar las opciones en la línea de comando.
- ‘h’ es una opción sin valor.
- ‘v:’ implica que la opción -v tiene un valor y es una opción requerida. ‘:’ significa que tiene un valor.
- ‘t ::’ implica que la opción -t tiene un valor pero es opcional. ‘::’ significa opcional.
En el parámetro opcional, el valor no se puede separar por espacios con la opción. Entonces, en el ejemplo, «-t123» es -t, la opción 123 es el valor.
Sintaxis: segunda forma
getopt [getopt_options] [--] [optstring] [parameters]
A continuación, la parte superior se divide en cinco partes.
- El mando en sí, tan rematado.
- getopt_options, describe cómo se analizan los argumentos. Opciones de barra simple larga, opciones de barra doble.
- -, separa getopt_options de las opciones que desea analizar y las opciones cortas permitidas
- Las opciones cortas se toman tan pronto como se encuentran. Al igual que la sintaxis de la primera forma.
- Los parámetros son las opciones que le pasaste al programa. Obtenga las opciones que desea analizar y los valores reales que se establecen 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, la parte superior se divide en cinco partes.
- El mando en sí, tan rematado.
- getopt_options, describe cómo se analizan los argumentos. Opciones de barra simple larga, opciones de barra doble.
- Opciones cortas, es decir, opciones -oo. Como la sintaxis de la primera forma, pero con la opción «-o» y antes del «-» (doble guión).
- -, separa getopt_options de las opciones que desea analizar y las opciones cortas permitidas
- Los parámetros son las opciones que le pasaste al programa. Obtenga las opciones que desea analizar y los valores reales que se establecen en ellas.
Ejemplos de
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
OBTENER_OPCIONES
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 principales
Opción: -lo – opciones largas
Esto significa que el comando getopt debería permitir el reconocimiento de opciones de varios caracteres. Varias opciones están separadas por comas.
Por ejemplo, --name=Karthik
es una opción larga enviada en la línea de comando. En getopt, usar opciones largas es similar
getopt "name:,version" "--name=Karthik"
Debido a que se especifica name:, la opción debe contener un valor
Opción: -a o –alternativa
Esto 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 su lugar --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
# [email protected] 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 -- "[email protected]")
# 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