Utilisation de getopts dans une fonction définie par l'utilisateur dans Bourne Shell
Question
Est-il possible de passer des arguments de ligne de commande dans une fonction à partir d'un script bourne, afin de permettre à getopts de les traiter.
Le reste de mon script est joliment emballé dans des fonctions, mais on commence à avoir l’impression de devoir déplacer le traitement des arguments dans la logique principale.
Voici comment cela est écrit maintenant, mais cela ne fonctionne pas:
processArgs() { while getopts j:f: arg do echo "${arg} -- ${OPTARG}" case "${arg}" in j) if [ -z "${filename}" ]; then job_number=$OPTARG else echo "Filename ${filename} already set." echo "Job number ${OPTARG} will be ignored. fi;; f) if [ -z "${job_number}" ]; then filename=$OPTARG else echo "Job number ${job_number} already set." echo "Filename ${OPTARG} will be ignored." fi;; esac done } doStuff1 processArgs doStuff2
Est-il possible de définir la fonction de manière à pouvoir lire les arguments de scripts? Cela peut-il être fait d'une autre manière? J'aime la fonctionnalité de getopts, mais dans ce cas, il va falloir que je sacrifie la beauté du code pour l'obtenir.
La solution
Vous pouvez fournir des arguments pour getopts après la variable. La valeur par défaut est $ @, mais c'est également ce que les fonctions de shell utilisent pour représenter leurs arguments . La solution est de passer & Quot; $ @ & Quot; & # 8212; représentant tous les arguments de ligne de commande du script sous forme de chaînes individuelles & # 8212; pour traiter les arguments:
processArgs "$@"
En ajoutant cela à votre script (et en corrigeant la citation à la ligne 11), et en essayant quelques arguments de test du charabia:
$ ./try -j asdf -f fooo -fasdfasdf -j424pyagnasd j -- asdf f -- fooo Job number asdf already set. Filename fooo will be ignored. f -- asdfasdf Job number asdf already set. Filename asdfasdf will be ignored. j -- 424pyagnasd