Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
utilisateurs:david5647:tutos:bash-gerer-les-parametres [24/03/2021 17:04] David5647 [Introduction] |
utilisateurs:david5647:tutos:bash-gerer-les-parametres [24/03/2021 17:20] (Version actuelle) David5647 [Introduction] |
||
---|---|---|---|
Ligne 8: | Ligne 8: | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | Voici quelques exemples permettant de créer des scripts bash possédants une gestion plus fine des paramètres d'entrées qu'un simple $@. | + | Voici quelques exemples permettant de créer des scripts bash possédants une gestion plus fine des paramètres d'entrées plutôt que la simple utilisation de leur position ($1, $2, ...) |
Avec ces scripts, vous pourrez supporter : | Avec ces scripts, vous pourrez supporter : | ||
Ligne 18: | Ligne 18: | ||
- Des paramètres booléens | - Des paramètres booléens | ||
<code>./script -o</code> | <code>./script -o</code> | ||
+ | |||
Le détail de fonctionnement des scripts est inclut en commentaire. | Le détail de fonctionnement des scripts est inclut en commentaire. | ||
- | ==== Paramètre booléen ==== | + | **bonus** : pour dé-commenter les scripts : <code user> cat script.sh | sed '/^\s*#/d' | sed 's/#.*$//' > script_sans commentaires.sh |
+ | </code> | ||
+ | |||
+ | ===== Paramètre booléen ===== | ||
=== Utilisation === | === Utilisation === | ||
Ligne 52: | Ligne 55: | ||
- | ==== Paramètre & valeur ==== | + | ===== Paramètre & valeur ===== |
=== Utilisation === | === Utilisation === | ||
Ligne 80: | Ligne 83: | ||
</file> | </file> | ||
- | ==== Paramètres nommé et court (-p) avec getopts ==== | + | ===== Paramètres nommé et court (-p) avec getopts ===== |
**getopts** fait parti des buildins de bash, ce qui permet d'être sûr son implémentation (dès lors que l'on utilise bash) | **getopts** fait parti des buildins de bash, ce qui permet d'être sûr son implémentation (dès lors que l'on utilise bash) | ||
Ligne 136: | Ligne 139: | ||
# itère sur les paramètres type "-p", | # itère sur les paramètres type "-p", | ||
while getopts ${optstring} arg ; do # ne prend pas en compte les positionnel (arg) | while getopts ${optstring} arg ; do # ne prend pas en compte les positionnel (arg) | ||
- | # ! le type long (--long) n'est pas accépté => cas '?)' | + | # ! le type long (--long) n'est pas accepté => cas '?)' |
case ${arg} in | case ${arg} in | ||
h) # Si $arg contient la valeur "h" | h) # Si $arg contient la valeur "h" | ||
Ligne 147: | Ligne 150: | ||
;; | ;; | ||
a) # Si $arg contient la valeur "a" | a) # Si $arg contient la valeur "a" | ||
- | PARAM_A="${OPTARG}" # getopts à défini la variable $OPTARG qui contient le paramètre succédant à "-a" | + | PARAM_A="${OPTARG}" # getopts a défini la variable $OPTARG qui contient le paramètre succédant à "-a" |
;; | ;; | ||
b) | b) | ||
Ligne 153: | Ligne 156: | ||
;; | ;; | ||
o) | o) | ||
- | OPTION_O='true' # On ne demanade pas de valeur, on passe simplement la variable à ture si l'option est présente | + | OPTION_O='true' # On ne demande pas de valeur, on passe simplement la variable à true si l'option est présente |
;; | ;; | ||
?) # l'arugment n'a pas été défini | ?) # l'arugment n'a pas été défini | ||
Ligne 168: | Ligne 171: | ||
</file> | </file> | ||
- | ==== Paramètres nommé et court (-p) et arguments positionnels avec getopts ==== | + | ===== Paramètres nommé et court (-p) et arguments positionnels avec getopts ===== |
**getops** ne gère pas les arguments positionnels, ce script permet leur implémentation | **getops** ne gère pas les arguments positionnels, ce script permet leur implémentation | ||
Ligne 221: | Ligne 224: | ||
done | done | ||
| | ||
- | # getopts itère jusqu'au premier arguement positionnel | + | # getopts itère jusqu'au premier argument positionnel |
# (c-à-d qui n'est pas sous forme '-p' ou ne correspond pas à une valeur (-p valeur)) | # (c-à-d qui n'est pas sous forme '-p' ou ne correspond pas à une valeur (-p valeur)) | ||
# | # | ||
Ligne 228: | Ligne 231: | ||
# $@ = -a value_a -b value_b arg_1 ... | # $@ = -a value_a -b value_b arg_1 ... | ||
# | # | ||
- | # optargs s'arrète à arg_1, | + | # optargs s’arrête à arg_1, |
# on a traité 4 arguments : '-a', 'value_a', 'b' et "value_b', et getopts à défini | # on a traité 4 arguments : '-a', 'value_a', 'b' et "value_b', et getopts à défini | ||
# | # | ||
Ligne 241: | Ligne 244: | ||
ARGS="${ARGS} $1 " # L'argument positionnel se retrouve en $1 | ARGS="${ARGS} $1 " # L'argument positionnel se retrouve en $1 | ||
- | shift # Une fois récupéré, on le conseomme et on recommence la boucle jusqu'à ce qu'il n'y ai plus d'arguments | + | shift # Une fois récupéré, on le consomme et on recommence la boucle jusqu'à ce qu'il n'y ai plus d'arguments |
done | done | ||
Ligne 249: | Ligne 252: | ||
</file> | </file> | ||
- | ==== Tout type de paramètre ==== | + | ===== Tout type de paramètre ===== |
Pour permettre l'utilisation d'argument long (--long) ou créer une implémentation compatible POSIX, | Pour permettre l'utilisation d'argument long (--long) ou créer une implémentation compatible POSIX, | ||
Ligne 270: | Ligne 273: | ||
help_msg () { | help_msg () { | ||
- | echo """ | + | printf """ |
usage: script [-h] [-o] [-a NAMED_A] [-b NAMED_B] | usage: script [-h] [-o] [-a NAMED_A] [-b NAMED_B] | ||
Ligne 294: | Ligne 297: | ||
# $@ = "value_a --long_b value_b" | # $@ = "value_a --long_b value_b" | ||
# | # | ||
- | # $# compte le nombre d'argument restants, et parconséquent est réduit de 1 à chaque "shift" | + | # $# compte le nombre d'argument restants, et par conséquent est réduit de 1 à chaque "shift" |
Ligne 300: | Ligne 303: | ||
# Soit la commande: | # Soit la commande: | ||
# | # | ||
- | # ./script.sh -a value_a --long_b value_b -o positionnal | + | # ./script.sh -a value_a --long_b value_b -o positional |
# | # | ||
- | # La variable $@ contient alors "-a value_a --long_ value_b -o positionnal" | + | # La variable $@ contient alors "-a value_a --long_ value_b -o positional" |
Ligne 313: | Ligne 316: | ||
case $key in # Teste $key pour les cas suivant: | case $key in # Teste $key pour les cas suivant: | ||
-h|--help) | -h|--help) | ||
- | help_msg # execute la fonction help () | + | help_msg # exécute la fonction help () |
exit 0 # et quitte le script | exit 0 # et quitte le script | ||
;; | ;; | ||
-a|--long_a) # la clé "-a" est reconnue | -a|--long_a) # la clé "-a" est reconnue | ||
PARAM_A="$2" # la valeur du paramètre PARAM_A vient juste après, soit $2 | PARAM_A="$2" # la valeur du paramètre PARAM_A vient juste après, soit $2 | ||
- | shift # consomme un arguement, $@ ne contient plus que "value_a -b value_b" | + | shift # consomme un argument, $@ ne contient plus que "value_a -b value_b" |
- | shift # consomme un deuxième arguement, $@ = "-b value_b" | + | shift # consomme un deuxième argument, $@ = "-b value_b" |
;; # On peut passer au tour suivant, avec $key prenant la valeur $1, soit "-b" | ;; # On peut passer au tour suivant, avec $key prenant la valeur $1, soit "-b" | ||
-b|--long_b) # (2e tour) : $key à la valeur "-b" et est reconnue | -b|--long_b) # (2e tour) : $key à la valeur "-b" et est reconnue | ||
Ligne 336: | Ligne 339: | ||
else # Si la clé commence par "-" | else # Si la clé commence par "-" | ||
echo "Argument non défini : '$key'" # C'est quelle ne fait pas partie de la liste définie plus haut | echo "Argument non défini : '$key'" # C'est quelle ne fait pas partie de la liste définie plus haut | ||
- | exit 1 # On arrète le programme | + | exit 1 # On arrête le programme |
fi | fi | ||
esac | esac | ||
- | done # FIN! Biensûr l'exemple est arrangé dans le "bon ordre", mais la position des arguments n'a pas d'importance. | + | done # FIN! Bien-sûr l'exemple est arrangé dans le "bon ordre", mais la position des arguments n'a pas d'importance. |
# Paramètres parsés | # Paramètres parsés | ||
- | echo "positional : $POSITIONAL" # Contient : "positionnal" | + | printf "positional : $POSITIONAL \n" # Contient : "positional" |
- | echo "param_a : $PARAM_A" # Contient : "value_a" | + | printf "param_a : $PARAM_A \n" # Contient : "value_a" |
- | echo "param_b : $PARAM_B" # Contient : "value_b" | + | printf "param_b : $PARAM_B \n" # Contient : "value_b" |
- | echo "option_o : $OPTION_O" # Contient : "true" | + | printf "option_o : $OPTION_O \n" # Contient : "true" |
</file> | </file> | ||
Ligne 351: | Ligne 354: | ||
- | ==== Séparer les paramètres ==== | + | ===== Séparer les paramètres ===== |
- | Dans le cas de paramètres inconnus à l'avance, ou pour un script plus leger, cette fonction permet de trier les différnet arguments en fonction de leur type supposé (positional(//arg//), named (//-n arg//), option (//-o//)) et les stocke dans 3 variables différentes. | + | Dans le cas de paramètres inconnus à l'avance, ou pour un script plus leger, cette fonction permet de trier les différents arguments en fonction de leur type supposé (positional(//arg//), named (//-n arg//), option (//-o//)) et les stocke dans 3 variables différentes. |
A defaut, un groupe `-n arg` est considéré comme **named** et non comme un **option** + **positional** | A defaut, un groupe `-n arg` est considéré comme **named** et non comme un **option** + **positional** |