Utilisez getopt
Pourquoi getopt ?
Analyser les arguments élaborés de la ligne de commande pour éviter toute confusion et clarifier les options que nous analysons afin que les lecteurs des commandes puissent comprendre ce qui se passe.
Qu'est-ce que getopt ?
getopt
est utilisé pour séparer (analyser) les options dans les lignes de commande pour faciliter l'analyse par les procédures de l'interpréteur de commandes, et pour vérifier les options légales. Il utilise l'algorithme GNU getopt(3)
des routines pour ce faire.
getopt
peut avoir les types d'options suivants.
- Options sans valeur
- options de paires clé-valeur
Note : 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/les exemples.
- est un caractère de remplacement, ce qui signifie qu'il doit être remplacé par une valeur réelle.
MODE D'EMPLOI getopt
?
Syntaxe : Première forme
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 dans la ligne de commande.
- h" est une option sans valeur.
- v:' implique que l'option -v a une valeur et que est une option obligatoire. ':' signifie a une valeur.
- t::' implique que l'option -t a une valeur mais est facultative. '::' signifie facultatif.
Dans un paramètre optionnel, la valeur ne peut pas être séparée par un espace avec l'option. Ainsi, dans l'exemple "-t123", -t est l'option 123 est la valeur.
Syntaxe : Deuxième forme
getopt [getopt_options] [--] optstring parameters
Après, getopt est divisé en cinq parties
- La commande elle-même, c'est-à-dire getopt.
- Le getopt_options, il décrit comment analyser les arguments. simple tiret options longues, double tiret options.
- --, sépare les options getopt_options des options que vous voulez analyser et des options courtes autorisées.
- Les options courtes, sont prises immédiatement après que -- soit trouvé. Tout comme la syntaxe Form first.
- Les paramètres, ce sont les options que vous avez passées au programme. Les options que vous voulez analyser et obtenir les valeurs réelles qui leur sont attribuées.
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 [getopt_options] [--] [parameters]
Après, getopt est divisé en cinq parties
- La commande elle-même, c'est-à-dire getopt.
- Le getopt_options, il décrit comment analyser les arguments. simple tiret options longues, double tiret options.
- Les options courtes, c'est-à-dire -o ou --options. Comme la première syntaxe de la forme, mais avec l'option "-o" et avant le "--" (double tiret).
- --, sépare les options getopt_options des options que vous voulez analyser et des options courtes autorisées.
- Les paramètres, ce sont les options que vous avez passées au programme. Les options que vous voulez analyser et obtenir les valeurs réelles qui leur sont attribuées.
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 la ligne de commande sont analysés.
Voici quelques-unes des options de getopt_options
Option : -l ou --longoptions
Les moyens de la commande getopt devraient permettre aux options à plusieurs caractères d'être reconnues. Les options multiples sont séparées par une virgule.
Par exemple, --name=Karthik
est une option longue envoyée dans la ligne de commande. Dans getopt, les options longues sont utilisées comme suit
getopt -l "name:,version" -- "" --name=Karthik
Puisque name : est spécifié, l'option doit contenir une valeur
Option : -a ou --alternative
La commande getopt devrait permettre aux options longues d'avoir un simple tiret plutôt qu'un double tiret '--'.
Exemple, au lieu de --name=Karthik
vous pourriez utiliser seulement -name=Karthik
getopt -a -l "name:,version" -- "" -name=Karthik
Un exemple complet de script 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
6 votes
Les options sont censées être facultatives. Si vous avez besoin de la valeur spécifiée par
-s
pour en faire un argument de position :./myscript 45 anystring
.1 votes
@chepner
$./myscript -s 45 -p any_string
2 votes
C'est bien si
-p
est en fait une option (c'est-à-dire que votre programme peut continuer s'il n'est pas présent). Dans ce cas,./myscript 45 -p any_string
. (Je pense quegetopt
peut gérer des options mixtes et des arguments positionnels, alors que la méthodebash
commande intégréegetopts
exige que tous les arguments positionnels soient placés après les options).