Utilizzo di getopts all'interno della funzione definita dall'utente nella shell bourne

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

  •  20-08-2019
  •  | 
  •  

Domanda

È possibile passare argomenti da riga di comando in una funzione all'interno di uno script bourne, al fine di consentire a getopts di elaborarli.

Il resto del mio script è ben suddiviso in funzioni, ma sta iniziando a sembrare che dovrò spostare l'elaborazione dell'argomento nella logica principale.

Quanto segue è come è scritto ora, ma non funziona:

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

È possibile forse definire la funzione in modo da poter leggere gli script args? Questo può essere fatto in un altro modo? Mi piace la funzionalità di getopts, ma sembra che in questo caso dovrò sacrificare la bellezza del codice per ottenerlo.

È stato utile?

Soluzione

Puoi fornire args a getopts dopo la variabile. Il valore predefinito è $ @, ma è anche quello che le funzioni della shell usano per rappresentare i loro argomenti . La soluzione è passare & Quot; $ @ & Quot; & # 8212; che rappresenta tutti gli argomenti della riga di comando dello script come stringhe individuali & # 8212; processArgs:

processArgs "$@"

Aggiungendolo allo script (e correggendo il preventivo nella riga 11), e provando alcuni arguti test senza senso:

$ ./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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top