Utilisation getopt
Pourquoi getopt?
Analyser les arguments de ligne de commande élaborés pour éviter toute confusion et clarifier les options que nous analysons afin que le lecteur des commandes puisse comprendre ce qui se passe.
Qu'est-ce que Getopt?
getopt
est utilisé pour décomposer (analyser) les options dans les lignes de commande pour une analyse facile par les procédures shell et pour vérifier les options légales. Il utilise les getopt(3)
routines GNU pour ce faire.
getopt
peut avoir les types d'options suivants.
- Options sans valeur
- options de paire clé-valeur
Remarque: Dans ce document, lors de l'explication de la syntaxe:
- Tout ce qui se trouve à l'intérieur de [] est un paramètre facultatif dans la syntaxe / exemples.
- est un espace réservé, ce qui signifie qu'il doit être remplacé par une valeur réelle.
COMMENT UTILISER getopt
?
Syntaxe: premier formulaire
getopt optstring parameters
Exemples:
# 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"
Ici h, v, t sont les options et -h -v -t est la façon dont les options doivent être données en ligne de commande.
- 'h' est une option sans valeur.
- 'v:' implique que l'option -v a une valeur et est une option obligatoire. ':' signifie a une valeur.
- 't ::' implique que l'option -t a une valeur mais est facultative. '::' signifie facultatif.
Dans param facultatif, la valeur ne peut pas avoir de séparation d'espaces avec l'option. Ainsi, dans l'exemple "-t123", -t est l'option 123 est la valeur.
Syntaxe: deuxième formulaire
getopt [getopt_options] [--] [optstring] [parameters]
Ici, après getopt est divisé en cinq parties
- La commande elle-même ie getopt
- Le getopt_options, il décrit comment analyser les arguments. options longues simple tiret, options double tiret.
- -, sépare les options getopt_options des options que vous souhaitez analyser et des options courtes autorisées
- Les options courtes sont prises immédiatement après - est trouvée. Tout comme la première syntaxe du formulaire.
- Les paramètres, ce sont les options que vous avez passées dans le programme. Les options que vous souhaitez analyser et obtenir les valeurs réelles qui y sont définies.
Exemples
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
Syntaxe: troisième forme
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
Ici, après getopt est divisé en cinq parties
- La commande elle-même ie getopt
- Le getopt_options, il décrit comment analyser les arguments. options longues simple tiret, options double tiret.
- Les options courtes, à savoir -o ou --options. Tout comme la première syntaxe du formulaire mais avec l'option "-o" et avant le "-" (double tiret).
- -, sépare les options getopt_options des options que vous souhaitez analyser et des options courtes autorisées
- Les paramètres, ce sont les options que vous avez passées dans le programme. Les options que vous souhaitez analyser et obtenir les valeurs réelles qui y sont définies.
Exemples
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options change la façon dont les paramètres de ligne de commande sont analysés.
Voici quelques-unes des options getopt_options
Option: -l ou --longoptions
Signifie que la commande getopt doit permettre de reconnaître les options à plusieurs caractères. Plusieurs options sont séparées par une virgule.
Par exemple, --name=Karthik
une longue option est envoyée en ligne de commande. Dans getopt, l'utilisation des options longues est comme
getopt "name:,version" "--name=Karthik"
Puisque le nom: est spécifié, l'option doit contenir une valeur
Option: -a ou --alternative
Signifie que la commande getopt doit permettre à l'option longue d'avoir un seul tiret '-' plutôt qu'un double tiret '-'.
Par exemple, au lieu de --name=Karthik
vous pouvez utiliser simplement-name=Karthik
getopt "name:,version" "-name=Karthik"
Un exemple de script complet avec le code:
#!/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
Exécution de ce fichier 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
, faire un argument de position:./myscript 45 anystring
.