Das Übergeben von Argumenten an ein Programm ist eine der häufigsten Operationen in jeder von Ihnen verwendeten Sprache. In ähnlicher Weise werden wir in diesem Artikel sehen, wie Argumente in Bash-Skripten mit der integrierten Bash-Funktion von getopts in Linux geparst werden.
Einführung
Jedem Befehl, den wir im Terminal ausführen, ist ein Argument zugeordnet. Beispielsweise können Sie den grundlegendsten Befehl in Linux namens df verwenden die die Speicherplatznutzung des Dateisystems anzeigt. Es akzeptiert Argumente/Flags wie -h
, -i
, --version
usw.
Wenn Sie je nach Anwendungsfall Shell-Skripte erstellen, müssen Sie das Skript möglicherweise basierend auf dem übergebenen Argument verarbeiten.
Es gibt zwei Möglichkeiten, Argumente zu parsen, die in Bash an das Skript übergeben werden.
Einer schreibt die Logik zum manuellen Analysieren der Argumente mit den speziellen Variablen [E-Mail-geschützt], $1, $2 … $N. Eine andere Möglichkeit wäre die Verwendung von getopts .
Getopts ist eine POSIX-kompatible Bash-integrierte Funktion, die kurze Argumente wie -h
akzeptiert , -v
, -b
usw. Sie können keine langen Argumente wie --help
übergeben , --version
. Wenn Sie lange Optionen analysieren möchten, gibt es ein anderes Dienstprogramm namens getopt Dies ist ein externes Programm und nicht in Bash integriert.
Es gibt drei mögliche Szenarien, die mir bei der Arbeit mit Flags/Argumenten einfallen.
- Das Skript, das auch dann ausgeführt wird, wenn keine Argumente oder Flags übergeben werden.
- Das Skript, das Flags akzeptiert, aber keine Argumente.
- Das Skript, das Flags und zugehörige Argumente für das Flag akzeptiert.
In den nächsten Abschnitten erfahren Sie, wie Sie ein Bash-Skript erstellen, das die obigen Szenarien erfüllt.
Hilfe bekommen
Sie können den folgenden Hilfebefehl ausführen, um auf den Hilfebereich von getopts zuzugreifen.
$ getopts -help
Kernkonstrukt von Getopten
Es gibt vier wichtige Begriffe, die Sie kennen sollten, um mit Getopten zu arbeiten.
getopts: getopts optstring name [arg …]
OPTSTRING
- Die Liste der Zeichen, die als Argumente erkannt werden. Beispiel:-h
,-v
.OPTNAME
– Das geparste Argument von[email protected]
wird imOPTNAME
gespeichert Variable. Sie können einen beliebigen Namen als optname verwenden.OPTARG
- Wenn zusätzliche Argumente übergeben werden, dann wird das imOPTARG
gespeichert variabel.OPTIND
- Index, der auf das nächste zu verarbeitende Argument zeigt.
Wenn Sie die Argumente an das Skript übergeben, werden sie in der Variable [email protected] gespeichert. Getopts erhält die Liste der Argumente von [email protected], verwenden Sie OPTIND
und analysieren.
Sie sollten die Liste der erkannten Argumente in OPTSTRING
angeben . While-Schleife wird verwendet, um über die Liste der übergebenen Argumente zu iterieren und OPTIND
zu verwenden , erhält getopts das Argument und speichert es in OPTNAME
.
Die Case-Anweisung wird verwendet, um zu prüfen, ob das Muster mit OPTNAME
übereinstimmt und führen Sie die entsprechende Anweisung aus.
Ich werde den folgenden Code im gesamten Artikel ausführen. Dies ist ein einfach zu verstehender Code. Zuerst habe ich eine Funktion namens "help" erstellt ", wo es eine Verwendungssyntax für mein Skript gibt.
Ich verwende drei Argumente in OPTSTRING; "-s
, -T
, -h
". Variable mit dem Namen ARG
ist der OPTNAME
im folgenden Code verwendet. Das geparste Argument wird in $ARG
gespeichert und unter Verwendung der case-Anweisung wird versucht herauszufinden, ob das Muster mit dem Argument im ARG
übereinstimmt Variable.
Das folgende Skript akzeptiert Flags wie -s
, -h
, -T
und Sie können auch Flags wie -shT
kombinieren .
#!/bin/bash function help(){ echo "USAGE: args.sh -s, -T <arg>, -h" } while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing" ;; \?) echo "Something is wrong" ;; esac done shift "$((OPTIND-1))"
Die Funktionalität des obigen Codes wird im nächsten Abschnitt ausführlich erklärt.
Kein Argument bestanden
Das Standardverhalten von getopts ist, wenn kein Argument übergeben wird, wird es keine Fehlermeldung ausgeben und mit dem Rückgabecode Null beendet .
In einigen Fällen sollte das Skript nicht ausgeführt werden, wenn kein Argument übergeben wird. In diesem Fall können Sie bedingte Anweisungen verwenden, um die Länge der übergebenen Argumente zu überprüfen ([email protected]
) Null ist oder nicht. Wenn keine Argumente übergeben werden, schlägt das Skript fehl.
Sehen Sie sich den folgenden Code an. Ich speichere die übergebenen Argumente in der Variablen PASSED_ARGS
und überprüfe die Länge davon. Wenn die Länge von PASSED_ARGS
nicht Null ist, dann while loop
with getopts wird ausgeführt, sonst help
Funktion wird ausgeführt und das Skript wird mit dem Rückgabecode 1 beendet .
[email protected] if [[ ${#PASSED_ARGS} -ne 0 ]] then while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing for $ARG" ;; \?) echo "Something is wrong" ;; esac done else help exit 1 fi shift "$((OPTIND-1))"
Sie können auch den folgenden Einzeiler verwenden, um die übergebenen Argumente auszuwerten.
[[ ${#PASSED_ARGS} -ne 0 ]] && echo "Arguments stored in \[email protected] = [email protected]" || { echo "No argument passed"; help; exit 1; }
Argumente mit Flags und die unterstützten Argumente
Sie können entweder einfach Flags wie -h
übergeben oder -s
zum Skript oder Flags und zugehörigem Argument wie -T
dazu. Sie sollten einen Doppelpunkt hinzufügen (: ) nach dem Flag-Bezeichner (-T
), damit das Flag das Argument akzeptiert.
Im folgenden Code können Sie sehen, dass ich einen Doppelpunkt hinzugefügt habe (:
) nach dem Bezeichner T
. Es bedeutet, wenn ich das -T
übergebe Flag an das Skript, sollte ich ein zusätzliches Argument mit übergeben.
while getopts ":sT:h" ARG; do
Wenn ein Argument an das Flag übergeben wird, wird es in der Variablen $OPTARG
gespeichert . Sie müssen Logik schreiben, um die Variable zu erfassen und entsprechend zu verarbeiten. Kopieren Sie denselben Code aus dem vorherigen Abschnitt und führen Sie ihn aus.
T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;;
Sie können auch mehrere Argumente gleichzeitig kombinieren und ausführen.
Behandlung von Fehlern
Es kann Situationen geben, in denen Argumente falsch übergeben werden und das Skript einige Fehler ausgeben sollte.
Standardmäßig gibt getopts eine Fehlermeldung aus, wenn ein übergebenes Flag nicht in OPTSTRING
enthalten ist oder wenn Sie keine zusätzlichen Argumente an das Flag übergeben. Hinzufügen eines Doppelpunkts bis zum Anfang von OPTSTRING
unterdrückt die Standardfehlermeldungen.
Lassen Sie uns den Doppelpunkt entfernen und das Skript erneut ausführen. Ich übergebe -x
als erstes Argument, das nicht in OPTSTRING
vorhanden ist . Zweitens -T
erfordert ein zusätzliches Argument, das ich nicht angegeben habe. In beiden Fällen wird mir der Fehler angezeigt.
Jetzt können Sie die Standardfehlermeldungen unterdrücken und Ihre eigenen Fehlermeldungen drucken. Sehen Sie sich die folgenden Muster aus der Case-Anweisung an.
- Doppelpunkt (:) -> Wenn kein zusätzliches Argument übergeben wird
OPTARG
wird auf Doppelpunkt gesetzt und Sie können Logik schreiben, um Fehlermeldungen auszugeben. - \? -> Wenn ein Argument nicht in
OPTSTRING
ist übergeben wird,OPTNAME
wird auf "?
gesetzt ".
:) echo "argument missing" ;; \?) echo "Something is wrong" ;;
Verwendung von Shift und OPTIND
Wenn Sie vorhandene Skripte verwenden, die mit getopts geschrieben wurden, sehen Sie diese Anweisung nach while
Schleife.
shift "$((OPTIND-1))"
Wenn das Skript ausgelöst wird, OPTIND
auf 1 gesetzt ist . Die OPTIND
zeigt auf die Position des nächsten Arguments, das von getopts verarbeitet werden soll.
Die obige Anweisung entfernt alle Optionen, die von den getopts und $1
geparst wurden wird nicht auf das erste nicht optionale Argument gesetzt, das an das Skript übergeben wird.
Schlussfolgerung
In diesem Artikel haben wir gesehen, wie Argumente in Bash-Skripten mit der Funktion getopts analysiert werden. Getopts unterstützt nur eine kurze Form von Argumenten und Sie können keine langen Argumente übergeben.
Auf den ersten Blick mag es schwierig erscheinen, mit Getopts zu arbeiten. Aber wenn Sie das Kernkonzept verstehen, wird es einfach.
Ähnliches Lesen:
- So analysieren Sie CSV-Dateien in Bash-Skripten unter Linux
Bash-Scripting-Leitfäden:
- Erstellen von GUI-Dialogfeldern in Bash-Skripten mit Zenity unter Linux und Unix
- Bash-Skripting – Case-Statement
- Bash-Skripting – Bedingte Anweisungen
- Bash-Skripting – String-Manipulation
- Bash-Skripting – Printf-Befehl mit Beispielen erklärt
- Bash-Skripting – Indiziertes Array mit Beispielen erklärt
- Bash-Skripting – Assoziatives Array mit Beispielen erklärt
- Bash-Skripting – For-Schleife mit Beispielen erklärt
- Bash-Skripting – While- und Until-Schleife mit Beispielen erklärt
- Bash-Umleitung mit Beispielen erklärt
- Bash-Scripting – Variablen mit Beispielen erklärt
- Bash-Scripting – Funktionen mit Beispielen erklärt
- Bash-Echo-Befehl mit Beispielen in Linux erklärt
- Bash Heredoc-Tutorial für Anfänger