Wie man Shell-Skript-Flags und -Argumente mit getopts

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.