Wenn Sie getopt verwenden, um Kommandozeilenparameter zu analysieren, können Sie ein Leerzeichen zwischen dem Optionsflag und dem Argument für erforderliche Argumente setzen, nicht jedoch für optionale Argumente. Optionale Argumente werden nur analysiert, wenn sie direkt hinter der Option stehen.Warum kann ich ein Leerzeichen zwischen Option und optionalem Argument mit getopt nicht haben?
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
(Auf dieser Basis: http://software.frodo.looijaard.name/getopt/docs/getopt-parse.bash)
Als ich das Skript ohne das optionale Argument funktioniert es:
./mkqueue.sh -p adfsa -q
Option p, argument `adfsa'
Option q, no argument
Wenn ich versuche, das optionale Argument hinzuzufügen, mit einem -q Platz dazwischen Es funktioniert nicht:
./mkqueue.sh -p adfsa -q sdfasdfa
Option p, argument `adfsa'
Option q, no argument
Es funktioniert, wenn Sie nicht als haben Tempo zwischen Option und Argument, obwohl die erforderlichen Argumente mit dem Leerzeichen arbeiten:
./mkqueue.sh -p adfsa -qsdfasdfa
Option p, argument `adfsa'
Option q, argument `sdfasdfa'
Gibt es eine Lösung dafür?
Wenn es erlaubt wäre, würden Sie ein anderes Problem bekommen. Angenommen, Ihr Programm akzeptiert auch ein Positionsargument. Sollte './a.out -q foo bar' als' ./a.out -qfoo bar' oder als './a.out -q - foo bar' geparst werden? – 5gon12eder
@ 5gon12eder, wenn du das als Antwort hättest, hättest du zumindest meinen upvote. Es erklärt das "Warum", was der Titel dieser Frage verlangt. :) –