comment analyser correctement les indicateurs et les arguments de script shell en utilisant getopts

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *