GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Skripting – Analysieren Sie Argumente in Bash-Skripten mithilfe von getopts

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 …]
  1. OPTSTRING - Die Liste der Zeichen, die als Argumente erkannt werden. Beispiel:-h , -v .
  2. OPTNAME – Das geparste Argument von [email protected] wird im OPTNAME gespeichert Variable. Sie können einen beliebigen Namen als optname verwenden.
  3. OPTARG - Wenn zusätzliche Argumente übergeben werden, dann wird das im OPTARG gespeichert variabel.
  4. 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

Linux
  1. Verwenden von Bash für die Automatisierung

  2. Bash-Scripting(I)

  3. Geben Sie zwei Argumente für eine Option mit Getopts an?

  4. Verwenden des Linux-Sleep-Befehls in Bash-Skripten

  5. Verwenden des Linux-Basisnamenbefehls in Bash-Skripten

Shell-Scripting für Anfänger – So schreiben Sie Bash-Scripts unter Linux

Bash-Skripting (II)

Verwenden des Linux-Dirname-Befehls in Bash-Skripten

Bash-Anfängerserie Nr. 5:Verwenden von arithmetischen Operatoren in Bash-Skripten

Bash-Anfängerserie Nr. 3:Übergabe von Argumenten an Bash-Skripte

Erstellen von Klassen und Objekten mit Bash-Scripting