Ich weiß, dass ich in bash leicht positionierte Parameter wie diesen erhalten kann:
$0
oder $1
Ich möchte in der Lage sein, Flag-Optionen wie diese zu verwenden, um anzugeben, wofür jeder Parameter verwendet wird:
mysql -u user -h host
Was ist der beste Weg, um -u param
Wert und -h param
Wert nach Flag anstatt nach Position zu erhalten?
Antworten:
Dies ist die Redewendung, die ich normalerweise verwende:
Wichtige Punkte sind:
$#
ist die Anzahl der Argumentequelle
--action*
und--output-dir*
Fälle?--action=[ACTION]
, sowie für den Fall, dass jemand tippt--action [ACTION]
*)
brechen Sie dort ab, sollten Sie die schlechte Option nicht verlassen oder ignorieren? Mit anderen Worten,-bad -o dir
das-o dir
Teil wird niemals verarbeitet.In diesem Beispiel wird der in Bash integrierte
getopts
Befehl verwendet und stammt aus dem Google Shell Style Guide :Hinweis: Wenn auf ein Zeichen ein Doppelpunkt folgt (z. B.
f:
), wird erwartet, dass diese Option ein Argument enthält.Anwendungsbeispiel:
./script -v -a -b -f filename
Die Verwendung von getopts hat gegenüber der akzeptierten Antwort mehrere Vorteile:
-a -b -c
→-abc
)Ein großer Nachteil ist jedoch, dass keine langen Optionen unterstützt werden, sondern nur Optionen mit nur einem Zeichen.
quelle
?) printf '\nUsage: %s: [-a] aflag [-b] bflag\n' $0; exit 2 ;;
getopt ist dein Freund .. ein einfaches Beispiel:
In Ihrem Verzeichnis / usr / bin sollten sich verschiedene Beispiele befinden.
quelle
/usr/share/doc/util-linux/examples
, zumindest auf Ubuntu-Computern.Ich denke, dies wäre ein einfacheres Beispiel dafür, was Sie erreichen möchten. Es ist nicht erforderlich, externe Tools zu verwenden. Eingebaute Bash-Tools können die Arbeit für Sie erledigen.
Auf diese Weise können Sie Flags verwenden, sodass Sie unabhängig von der Reihenfolge, in der Sie die Parameter übergeben, das richtige Verhalten erhalten.
Beispiel:
Ausgabe :
Sie können diese Funktion Ihrem Profil hinzufügen oder in ein Skript einfügen.
Vielen Dank!
Bearbeiten: Speichern Sie diese als aa-Datei und führen Sie sie dann als aus
yourfile.sh -last "Adios" -first "Hola"
quelle
./hello.sh DOSOMETHING -last "Adios" -first "Hola"
return 1;
mit dem letzten Beispiel Ausgabencan only 'return' from a function or sourced script
unter macOS. Der Wechsel zuexit 1;
funktioniert jedoch wie erwartet.Eine andere Alternative wäre, etwas wie das folgende Beispiel zu verwenden, mit dem Sie lange --image- oder kurze -i- Tags verwenden und auch kompilierte -i = "example.jpg" - oder separate -i example.jpg- Methoden zum Übergeben von Argumenten zulassen können .
quelle
Ich mag die Antwort von Robert McMahan hier am besten, da es am einfachsten zu sein scheint, gemeinsam nutzbare Include-Dateien für eines Ihrer Skripte zu verwenden. Aber es scheint einen Fehler in der Zeile zu geben
if [[ -n ${variables[$argument_label]} ]]
, die die Nachricht "Variablen: schlechter Array-Index" auslöst. Ich habe nicht die rep zu kommentieren, und ich bezweifle , das ist die richtige ‚fix‘ , aber Einwickeln , dassif
inif [[ -n $argument_label ]] ; then
säubert sie auf.Hier ist der Code, mit dem ich gelandet bin. Wenn Sie einen besseren Weg kennen, fügen Sie bitte einen Kommentar zu Roberts Antwort hinzu.
Include-Datei "flags-declares.sh"
Include-Datei "flags-arguments.sh"
Dein "script.sh"
quelle
Wenn Sie mit Python argparse vertraut sind und es Ihnen nichts ausmacht, Python aufzurufen, um Bash-Argumente zu analysieren, gibt es einen Code, den ich als sehr hilfreich und sehr einfach zu verwenden empfand: argparse-bash https://github.com/nhoffman/ Argparse-Bash
Beispiel aus ihrem Beispiel.sh-Skript:
quelle
Ich schlage eine einfache TLDR vor:; Beispiel für die nicht initiierten.
Erstellen Sie ein Bash-Skript mit dem Namen helloworld.sh
Sie können dann
-n
beim Ausführen des Skripts einen optionalen Parameter übergeben .Führen Sie das Skript als solches aus:
Ausgabe
Anmerkungen
Wenn Sie mehrere Parameter verwenden möchten:
while getops "n:" arg: do
mit mehr Parametern wiewhile getops "n:o:p:" arg: do
o) Option=$OPTARG
undp) Parameter=$OPTARG
quelle
Speichern Sie es als sample.sh und versuchen Sie es auszuführen
in Ihrem Terminal.
quelle
Ich hatte Probleme, getopts mit mehreren Flags zu verwenden, also habe ich diesen Code geschrieben. Es verwendet eine modale Variable, um Flags zu erkennen und diese Flags zu verwenden, um Variablen Argumente zuzuweisen.
Beachten Sie, dass, wenn ein Flag kein Argument haben sollte, etwas anderes als das Setzen von CURRENTFLAG ausgeführt werden kann.
quelle
Hier ist es also meine Lösung. Ich wollte in der Lage sein, boolesche Flags ohne Bindestrich, mit einem Bindestrich und mit zwei Bindestrichen sowie mit der Zuweisung von Parametern / Werten mit einem und zwei Bindestrichen zu verarbeiten.
Einige Referenzen
declare
do$ bash -c "help declare"
.shift
do$ bash -c "help shift"
.quelle