richtig analysiert Ich verwende Folgendes:
zum Beispiel ./imgSorter.sh -d directory -f format
der Inhalt der Skripte“ lautet:
#!/bin/bash while getopts ":d:f:" opt; do case $opt in d) echo "-d was triggered with $OPTARG" >&2 ;; f) echo "-f was triggered with $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done
Anwendungsfälle:
$ ./imgSorter.sh -d myDir -d was triggered with myDir
OK
$ ./imgSorter.sh -d -f myFormat -d was triggered with -f
NOK: Wie kommt es, dass eine Zeichenfolge, die mit – beginnt, nicht als Flag erkannt wird?
Antwort
Sie haben getopts
mitgeteilt, dass die -d
sollte ein Argument enthalten, und in der Befehlszeile verwenden Sie -d -f myformat
, das eindeutig (?) besagt, dass „-f
das ist Argument, das ich der Option -d
„gebe.
Dies ist kein Fehler im Code, sondern in der Verwendung des Skripts in der Befehlszeile.
Ihr Code muss überprüfen, ob die Optionsargumente korrekt sind und ob alle Optionen in geeigneter Weise festgelegt sind.
Möglicherweise so etwas wie
while getopts "d:f:" opt; do case $opt in d) dir=$OPTARG ;; f) format=$OPTARG ;; *) echo "error" >&2 exit 1 esac done # If -d is *required* if [ ! -d "$dir" ]; then echo "Option -d missing or designates non-directory" >&2 exit 1 fi # If -d is *optional* if [ -n "$dir" ] && [ ! -d "$dir" ]; then echo "Option -d designates non-directory" >&2 exit 1 fi
Wenn die Option -d
optional ist und Sie einen Standardwert für die Variable dir
Im obigen Code setzen Sie zunächst dir
auf diesen Standardwert vor while
Schleife.
Eine Befehlszeilenoption kann kein Argument annehmen und nicht annehmen.
Kommentare
- OK, danke @Kusalananda, ich habe fälschlicherweise angenommen, dass getopts alle – für den Anfang einer Flagge – genommen hat.