Parfois vous devrez peut-être utiliser le même script pour exécuter de nombreux scénarios différents comme par exemple différents modèles avec différentes données ou quelque chose de similaire. Si le code comporte de nombreuses variables, la modification directe du code peut être dangereuse ou au moins ennuyeuse . Par conséquent, il peut être préférable de donner au script des arguments lors de son exécution.
On peut le faire avec getopts.
getops lit les arguments passés au script, comme suit :
script.sh -a argument_1 -b argument_2 -c argument_3
# ou
script.sh -b argument_2 -c argument_3 -a argument_1
Comme vous pouvez le voir dans l’exemple, l’ordre n’est pas important, mais il est obligatoire de mettre l’identifiant avant l’argument (la lettre après chaque “-“).
Voyons un exemple très simple.
Supposons que vous devez exécuter plusieurs modèles, stockés dans une liste, plusieurs fois et que vous souhaitiez enregistrer les résultats dans différents dossiers.
# liste de modèles
echo "mod1
mod2
mod3" > mod_list.txt
# et juste pour en tester un autre
echo "m1
m2
m3" > mod_list2.txt
On peut faire le travail de cette façon (qui n’est pas nécessairement la meilleure) :
#!/bin/bash
# Valeurs par défaut
start=1
stop=5
mod_list="mod_list.txt"
# Lecture des arguments
while getopts :s:f:m: option
do
case ${option} in
s) start=$OPTARG ;; # démarrer la séquence
f) stop=$OPTARG ;; # finir la séquence
m) mod_list=$OPTARG ;; # liste de modèles
esac
done
# Juste pour avoir la liste de nos arguments
echo "List of arguments:"
echo "start= $start"
echo "stop= $stop"
echo "mod_list= $mod_list"
# Lecture de la liste de modèles
model=$(cat $mod_list)
# Processus
for se in $(seq $start $stop);
do
for mod in $model;
do
# Créez un dossier pour le modèle et entrez-le
mkdir -p $mod
cd $mod
# Exécutez le modèle
echo $se " $mod result" | tee -a results_$mod.txt
# Retournez au dossier d'origine et faites de même pour le modèle suivant
cd ..
done
done
Dans ce cas, on peut passer au script trois arguments : -s, -f et -m ; pour trois variables : star, stop et mod_list. start et stop définiront une séquence et la liste des modèles est contenue dans mod_list.
La structure du script qui lit les arguments est la suivante :
# Lecture des arguments
while getopts :s:f:m: option
do
case ${option} in
s) start=$OPTARG ;; # démarrer la séquence
f) stop=$OPTARG ;; # finir la séquence
m) mod_list=$OPTARG ;; # liste de modèles
esac
done
Et juste avant, on a donné au script les valeurs par défaut des variables :
# Valeurs par défaut
start=1
stop=5
mod_list="mod_list.txt"
Si on mettait les valeurs par défaut getopts, celles que nous transmettons par arguments seraient écrasées.
Pour exécuter le script :
# Essayez-le sans arguments.
./myscript.sh
# Ou avec différents arguments.
./myscript.sh -m mod_file.txt -s 100 -f 150
./myscript.sh -s 56 -f 58 -m mod_list2.txt
Autres commandes du script :
Je remercie Manon de m’avoir aidé avec les corrections 😀