Myshell.sh :
#!/bin/bash
script_args=()
while [ $OPTIND -le "$#" ]
do
if getopts h:d:s: option
then
case $option
in
h) host_name="$OPTARG";;
d) wait_time="$OPTARG";;
s) script="$OPTARG";;
esac
else
script_args+=("${!OPTIND}")
((OPTIND++))
fi
done
"$script" "${script_args[@]}"
test.sh :
#!/bin/bash
echo "$0 $@"
Test des cas de l'OP :
$ PATH+=:. # Use the cases as written without prepending ./ to the scripts
$ myshell.sh -h hostname -s test.sh -d waittime param1 param2 param3
./test.sh param1 param2 param3
$ myshell.sh param1 param2 -h hostname param3 -d waittime -s test.sh
./test.sh param1 param2 param3
$ myshell.sh param1 -h hostname -d waittime -s test.sh param2 param3
./test.sh param1 param2 param3
Ce qui se passe :
getopts
échouera s'il rencontre un paramètre positionnel. S'il est utilisé comme condition de boucle, la boucle s'interrompt prématurément lorsque des paramètres de position apparaissent avant les options, comme c'est le cas dans deux des cas de test.
Ainsi, cette boucle ne s'interrompt que lorsque tous les paramètres ont été traités. Si getopts
ne reconnaît pas quelque chose, nous supposons simplement qu'il s'agit d'un paramètre positionnel, et nous le plaçons dans un tableau tout en incrémentant manuellement getopts
Le comptoir de l'entreprise.
Améliorations possibles :
Tel qu'il est écrit, le script enfant ne peut pas accepter d'options (uniquement des paramètres de position), puisque getopts
dans le wrapper script les mangera et affichera un message d'erreur, tout en traitant tout argument comme un paramètre positionnel :
$ myshell.sh param1 param2 -h hostname -d waittime -s test.sh -a opt1 param3
./myshell.sh: illegal option -- a
./test.sh param1 param2 opt1 param3
Si nous savons que l'enfant script ne peut accepter que des paramètres positionnels, alors myshell.sh
devrait probablement s'arrêter sur une option non reconnue. Cela pourrait être aussi simple que d'ajouter un dernier cas par défaut à la fin de la chaîne de caractères case
bloc :
\?) exit 1;;
$ myshell.sh param1 param2 -h hostname -d waittime -s test.sh -a opt1 param3
./myshell.sh: illegal option -- a
Si le script enfant doit accepter des options (tant qu'elles n'entrent pas en conflit avec les options de la rubrique myshell.sh
), nous pourrions changer getopts
pour rendre silencieux le rapport d'erreur en faisant précéder la chaîne d'options de deux points :
if getopts :h:d:s: option
Ensuite, nous utiliserons le dernier cas par défaut pour placer toute option non reconnue dans script_args
:
\?) script_args+=("-$OPTARG");;
$ myshell.sh param1 param2 -h hostname -d waittime -s test.sh -a opt1 param3
./test.sh param1 param2 -a opt1 param3