Utilisation de getopts dans une fonction définie par l'utilisateur dans Bourne Shell

StackOverflow https://stackoverflow.com/questions/352044

  •  20-08-2019
  •  | 
  •  

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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top