Uso getopt
Perché getopt?
Analizzare elaborati argomenti della riga di comando per evitare confusione e chiarire le opzioni che stiamo analizzando in modo che il lettore dei comandi possa capire cosa sta succedendo.
Che cos'è getopt?
getopt
viene utilizzato per scomporre (analizzare) le opzioni nelle righe di comando per un facile analisi mediante procedure di shell e per verificare le opzioni legali. Per getopt(3)
fare ciò usa le routine GNU .
getopt
può avere i seguenti tipi di opzioni.
- Opzioni senza valore
- opzioni coppia chiave-valore
Nota: in questo documento, durante la spiegazione della sintassi:
- Qualsiasi cosa all'interno di [] è un parametro facoltativo nella sintassi / esempi.
- è un segnaposto, il che significa che dovrebbe essere sostituito con un valore effettivo.
COME USARLO getopt
?
Sintassi: First Form
getopt optstring parameters
Esempi:
# 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"
Qui h, v, t sono le opzioni e -h -v -t è come le opzioni dovrebbero essere fornite nella riga di comando.
- 'h' è un'opzione senza valore.
- 'v:' implica che l'opzione -v ha valore ed è un'opzione obbligatoria. ':' significa che ha un valore.
- 't ::' implica che l'opzione -t ha valore ma è facoltativa. '::' significa facoltativo.
Nel parametro opzionale, il valore non può avere una separazione di spazi bianchi con l'opzione. Quindi, nell'esempio "-t123", -t è l'opzione 123 è valore.
Sintassi: seconda forma
getopt [getopt_options] [--] [optstring] [parameters]
Qui dopo getopt è diviso in cinque parti
- Il comando stesso vale a dire getopt
- Il getopt_options, descrive come analizzare gli argomenti. opzioni a trattino singolo, opzioni a trattino doppio.
- -, separa getopt_options dalle opzioni che si desidera analizzare e dalle opzioni brevi consentite
- Le opzioni brevi, sono prese immediatamente dopo - è stato trovato. Proprio come la prima sintassi del modulo.
- I parametri, queste sono le opzioni che hai passato nel programma. Le opzioni che si desidera analizzare e ottenere i valori effettivi impostati su di esse.
Esempi
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
Sintassi: terza forma
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
Qui dopo getopt è diviso in cinque parti
- Il comando stesso vale a dire getopt
- Il getopt_options, descrive come analizzare gli argomenti. opzioni a trattino singolo, opzioni a trattino doppio.
- Le opzioni brevi, ad esempio -o o --opzioni. Proprio come la prima sintassi del modulo ma con l'opzione "-o" e prima del "-" (doppio trattino).
- -, separa getopt_options dalle opzioni che si desidera analizzare e dalle opzioni brevi consentite
- I parametri, queste sono le opzioni che hai passato nel programma. Le opzioni che si desidera analizzare e ottenere i valori effettivi impostati su di esse.
Esempi
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options cambia il modo in cui vengono analizzati i parametri della riga di comando.
Di seguito sono riportate alcune delle getopt_options
Opzione: -l o --longoptions
Significa che il comando getopt dovrebbe consentire il riconoscimento delle opzioni multi-carattere. Più opzioni sono separate da virgola.
Ad esempio, --name=Karthik
è un'opzione lunga inviata nella riga di comando. In getopt, l'utilizzo di opzioni lunghe è simile
getopt "name:,version" "--name=Karthik"
Poiché il nome: è specificato, l'opzione deve contenere un valore
Opzione: -a o --alternative
Significa che il comando getopt dovrebbe consentire all'opzione lunga di avere un singolo trattino '-' anziché un doppio trattino '-'.
Esempio, invece di --name=Karthik
te potresti usare solo-name=Karthik
getopt "name:,version" "-name=Karthik"
Un esempio di script completo con il codice:
#!/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
Esecuzione di questo file di 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
, ne fanno un argomento posizionale:./myscript 45 anystring
.