Quando si utilizza getopt per analizzare i parametri della riga di comando, è possibile inserire uno spazio tra il flag di opzione e l'argomento per gli argomenti richiesti ma non per gli argomenti facoltativi. Gli argomenti facoltativi verranno analizzati solo se sono corretti dopo l'opzione.Perché non posso avere uno spazio tra l'opzione e l'argomento opzionale usando getopt?
TEMP=`getopt -o p:q:: -n 'mkqueue.sh' -- "[email protected]"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
# Now go through all the options
while true ; do
case "$1" in
-p) echo "Option p, argument \`$2'" ; shift 2 ;;
-q)
case "$2" in
"") echo "Option q, no argument"; shift 2 ;;
*) echo "Option q, argument \`$2'" ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
(Sulla base di questo: http://software.frodo.looijaard.name/getopt/docs/getopt-parse.bash)
Quando eseguo lo script senza l'argomento opzionale funziona:
./mkqueue.sh -p adfsa -q
Option p, argument `adfsa'
Option q, no argument
Se provo ad aggiungere l'argomento opzionale per -q con un spazio nel mezzo non funziona:
./mkqueue.sh -p adfsa -q sdfasdfa
Option p, argument `adfsa'
Option q, no argument
Funziona se non si dispone di passo tra l'opzione e l'argomento, anche se gli argomenti necessari funzionano con lo spazio:
./mkqueue.sh -p adfsa -qsdfasdfa
Option p, argument `adfsa'
Option q, argument `sdfasdfa'
C'è una soluzione per questo?
Se fosse permesso, avresti un altro problema. Supponiamo che il tuo programma accetti anche un argomento posizionale. Dovremmo './a.out -q foo bar' essere analizzato come' ./a.out -qfoo bar' o come './a.out -q - foo bar'? – 5gon12eder
@ 5gon12eder, se tu avessi quello come risposta, avresti almeno il mio upvote. Spiega il "perché", che è quello che chiede il titolo di questa domanda. :) –