Ich benutze getopts, um Argumente in Bash-Skripten als zu analysieren
while getopts ":hd:" opt; do
case $opt in
d ) echo "directory = $OPTARG"; mydir="$OPTARG"; shift $((OPTIND-1)); OPTIND=1 ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
exeparams="$*"
exeparams
enthält alle nicht analysierten Optionen / Argumente. Da ich exeparams verwenden möchte, um Optionen für einen Befehl zu speichern, der innerhalb des Skripts ausgeführt werden soll (was sich mit den eigenen Optionen des Skripts überschneiden kann), möchte ich verwenden, um die an das Skript übergebenen Optionen zu beenden. Wenn ich z
myscript -d myscriptparam -- -d internalparam
exeparams
wird halten
-- -d internalparam
Ich möchte jetzt die führende entfernen --
, um diese Argumente an den internen Befehl zu übergeben. Gibt es eine elegante Möglichkeit, dies zu tun, oder kann ich eine Zeichenfolge erhalten, die nur den Rest ohne --
Getopts enthält?
shift; OPTIND=1
in diegetopts
Schleife ist wahrscheinlich nicht der beste Weg, dies zu tun. Dies funktioniert nur in Ihrem Fall, da Sie nur zwei Optionen haben und in allen anderen nur das Skript beenden. Andernfalls würden Sieshift; OPTIND=1
in jeder Option benötigen , was doppelten Code bedeutet (schlechte Praxis). Machen Sie einfach eineshift $((OPTIND - 1))
unmittelbar nach dem Ende der Schleife - dies ist der konventionellste und wahrscheinlich auch der effizienteste Weg.Antworten:
Wie wäre es mit:
Beachten Sie, dass Sie ein Array verwenden sollten, um die Parameter zu speichern. Dadurch werden alle Argumente, die Leerzeichen enthalten, ordnungsgemäß behandelt. Dereferenzieren Sie das Array mit
"${exeparams[@]}"
quelle
--
, alsoscript foo -- bar
würde passierenfoo -- bar
an das externe Programm. Meine Antwort macht diese Annahme nicht, da sie in der Frage nicht explizit angegeben wurde.-- -d internalparams
. In jedem Fall ist meine Antwort allgemein genug, um beide Fälle zu behandeln.Verwenden Sie das eingebaute
shift
. Führen Sie zunächst das Normalegetopts
für Ihr Skript aus. Sobald diese Schleife abgeschlossen ist,verschiebt alle bereits verarbeiteten Optionen.
Von dort aus müssen Sie die Verarbeitung der Nichtoptionsargumente (falls vorhanden) bis zum ersten Teil des Skripts (vor dem
--
) abschließen. Sobald Sie auf das stoßen--
, verschieben Sie es heraus, bis nur der letzte Teil übrig bleibt (der-d internalparam
Teil, der danach kommt--
). Eine Möglichkeit, dies zu tun (unter Verwendung derbash
Syntax):Schließlich bleibt nur der zweite Satz von Optionen / Argumenten übrig, den Sie weitergeben können. Verwenden Sie diese Option NICHT
$*
, um die verbleibenden Parameter an einen anderen Befehl zu übergeben. Verwenden Sie"$@"
stattdessen, wodurch die ursprüngliche Wortaufteilung erhalten bleibt.quelle
--
?