J'aime la réponse de Robert McMahan car elle semble la plus facile à faire dans des fichiers include partageables pour n'importe lequel de vos scripts à utiliser. Mais elle semble avoir un défaut avec la ligne if [[ -n ${variables[$argument_label]} ]]
le message suivant apparaît : "variables : bad array subscript". Je n'ai pas la réputation pour commenter, et je doute que ce soit le bon "correctif", mais en enveloppant cela if
en if [[ -n $argument_label ]] ; then
le nettoie.
Voici le code que j'ai obtenu. Si vous connaissez une meilleure méthode, veuillez ajouter un commentaire à la réponse de Robert.
Inclure le fichier "flags-declares.sh".
# declaring a couple of associative arrays
declare -A arguments=();
declare -A variables=();
# declaring an index integer
declare -i index=1;
Inclure le fichier "flags-arguments.sh".
# $@ here represents all arguments passed in
for i in "$@"
do
arguments[$index]=$i;
prev_index="$(expr $index - 1)";
# this if block does something akin to "where $i contains ="
# "%=*" here strips out everything from the = to the end of the argument leaving only the label
if [[ $i == *"="* ]]
then argument_label=${i%=*}
else argument_label=${arguments[$prev_index]}
fi
if [[ -n $argument_label ]] ; then
# this if block only evaluates to true if the argument label exists in the variables array
if [[ -n ${variables[$argument_label]} ]] ; then
# dynamically creating variables names using declare
# "#$argument_label=" here strips out the label leaving only the value
if [[ $i == *"="* ]]
then declare ${variables[$argument_label]}=${i#$argument_label=}
else declare ${variables[$argument_label]}=${arguments[$index]}
fi
fi
fi
index=index+1;
done;
Votre "script.sh"
. bin/includes/flags-declares.sh
# any variables you want to use here
# on the left left side is argument label or key (entered at the command line along with it's value)
# on the right side is the variable name the value of these arguments should be mapped to.
# (the examples above show how these are being passed into this script)
variables["-gu"]="git_user";
variables["--git-user"]="git_user";
variables["-gb"]="git_branch";
variables["--git-branch"]="git_branch";
variables["-dbr"]="db_fqdn";
variables["--db-redirect"]="db_fqdn";
variables["-e"]="environment";
variables["--environment"]="environment";
. bin/includes/flags-arguments.sh
# then you could simply use the variables like so:
echo "$git_user";
echo "$git_branch";
echo "$db_fqdn";
echo "$environment";
2 votes
Ce serait une bonne idée de demander/vérifier à unix.stackexchange.com également
13 votes
Cherchez sur Google "bash getopts" -- beaucoup de tutoriels.
139 votes
@glenn-jackman : Je vais certainement le googler maintenant que je connais le nom. Le truc avec Google, c'est que pour poser une question, il faut déjà connaître 50% de la réponse.
0 votes
Jetez un coup d'œil à BashFAQ#035