Utilizzo di getopts all'interno della funzione definita dall'utente nella shell bourne
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.
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