Jutilise ceci:
par exemple ./imgSorter.sh -d directory -f format
le contenu des scripts » est:
#!/bin/bash while getopts ":d:f:" opt; do case $opt in d) echo "-d was triggered with $OPTARG" >&2 ;; f) echo "-f was triggered with $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done
cas dutilisation:
$ ./imgSorter.sh -d myDir -d was triggered with myDir
OK
$ ./imgSorter.sh -d -f myFormat -d was triggered with -f
NOK: comment se fait-il quune chaîne commençant par – ne soit pas détectée comme indicateur?
Réponse
Vous avez dit à getopts
que le -d
doit prendre un argument, et dans la ligne de commande vous utilisez -d -f myformat
qui clairement (?) dit « -f
est le argument que je « m donne à loption -d
« .
Ce nest pas une erreur dans le code, mais dans lutilisation du script sur la ligne de commande.
Votre code doit vérifier que les arguments doption sont corrects et que toutes les options sont définies de manière appropriée.
Peut-être quelque chose comme
while getopts "d:f:" opt; do case $opt in d) dir=$OPTARG ;; f) format=$OPTARG ;; *) echo "error" >&2 exit 1 esac done # If -d is *required* if [ ! -d "$dir" ]; then echo "Option -d missing or designates non-directory" >&2 exit 1 fi # If -d is *optional* if [ -n "$dir" ] && [ ! -d "$dir" ]; then echo "Option -d designates non-directory" >&2 exit 1 fi
Si loption -d
est facultative et si vous souhaitez utiliser une valeur par défaut pour la variable dir
dans le code ci-dessus, vous commenceriez par définir dir
sur cette valeur par défaut avant le while
boucle.
Une option de ligne de commande ne peut pas à la fois prendre et ne pas prendre un argument.
Commentaires
- ok merci @Kusalananda, jai supposé à tort que getopts prenait chaque – pour le début dun drapeau.