Ich wollte mit Ihnen teilen, was ich für Parsing-Optionen gemacht habe. Einige meiner Bedürfnisse wurden von den Antworten hier nicht erfüllt, also musste ich mir das hier einfallen lassen: https://github.com/MihirLuthra/bash_option_parser
Dies unterstützt:
- Unteroption parsen
- Aliasnamen für Optionen
- Optionale Argumente
- Variable Argumente
- Verwendung und Fehler beim Drucken
Nehmen wir an, wir haben einen Befehl namens fruit
mit folgender Verwendung:
fruit <fruit-name> ...
[-e|—-eat|—-chew]
[-c|--cut <how> <why>]
<command> [<args>]
-e
nimmt keine Argumente
-c
benötigt zwei Argumente, nämlich wie und warum geschnitten werden soll
fruit
selbst benötigt mindestens ein Argument.
<command>
ist für Unteroptionen wie apple
, orange
usw. (ähnlich wie bei git
mit den Unteroptionen commit
, push
usw. )
Um es also zu analysieren:
parse_options \
'fruit' '1 ...' \
'-e' , '--eat' , '--chew' '0' \
'-c' , '--cut' '1 1' \
'apple' 'S' \
'orange' 'S' \
';' \
"$@"
Wenn nun ein Verwendungsfehler auftrat, kann dieser mit option_parser_error_msg
wie folgt:
retval=$?
if [ $retval -ne 0 ]; then
# this will manage error messages if
# insufficient or extra args are supplied
option_parser_error_msg "$retval"
# This will print the usage
print_usage 'fruit'
exit 1
fi
Um nun zu prüfen, ob einige Optionen übergeben wurden,
if [ -n "${OPTIONS[-c]}" ]
then
echo "-c was passed"
# args can be accessed in a 2D-array-like format
echo "Arg1 to -c = ${ARGS[-c,0]}"
echo "Arg2 to -c = ${ARGS[-c,1]}"
fi
Das Parsen von Unteroptionen kann auch durch die Übergabe von $shift_count
a parse_options_detailed
was dazu führt, dass das Parsen nach dem Verschieben von args beginnt, um args der Unteroption zu erreichen. Dies wird in diesem Beispiel demonstriert Beispiel .
Eine ausführliche Beschreibung ist in der Readme-Datei und in den Beispielen enthalten in der Repository .
1 Stimmen
Für zsh-Benutzer gibt es ein großartiges builtin namens zparseopts, das das kann:
zparseopts -D -E -M -- d=debug -debug=d
Und haben beide-d
y--debug
im$debug
Arrayecho $+debug[1]
gibt 0 oder 1 zurück, wenn einer dieser Werte verwendet wird. Ref: zsh.org/mla/users/2011/msg00350.html2 Stimmen
Ein wirklich gutes Tutorial: linuxcommand.org/lc3_wss0120.php . Besonders gut gefällt mir das Beispiel "Befehlszeilenoptionen".
0 Stimmen
Ich habe ein Skript erstellt, das dies für Sie erledigt, es heißt - github.com/unfor19/bargs
2 Stimmen
Siehe auch Einem Bash-Skript die Möglichkeit geben, Flags zu akzeptieren, wie ein Befehl? für einen ausgeklügelten Ad-hoc-Parser für lange und kurze Optionen. Es wird nicht versucht, Optionsargumente zu behandeln, die an kurze Optionen angehängt sind, noch lange Optionen mit
=
die den Optionsnamen vom Optionswert trennt (in beiden Fällen wird einfach angenommen, dass der Optionswert im nächsten Argument steht). Es behandelt auch nicht die Clusterung von Kurzoptionen - die Frage brauchte das nicht.0 Stimmen
Diese tolle Anleitung von Baeldung zeigt 4 Möglichkeiten zur Verarbeitung von Kommandozeilenargumenten in der Bash, darunter: 1) Positionsbezogene Parameter
$1
,$2
, usw., 2) Flaggen mitgetopts
y${OPTARG}
3) Schleifenbildung über alle Parameter ($@
), und 4) Schleifenbildung über alle Parameter mit$#
,$1
und dieshift
Betreiber.0 Stimmen
Prüfen Sie die Lösung mit Bash Space-Separated: bigdata-etl.com/bash-parse-input-arguments-funtions-parameters