HOWTO · Bash

Überprüfen Sie, ob das Eingabeargument in Bash vorhanden ist

Dieses Tutorial beschreibt, ob ein Skriptbenutzer ein Eingabeargument an ein Bash-Skript übergeben hat.

Auf dieser Seite

Prüfen Sie die Positionsparameter eines Bash-Skripts, um festzustellen, ob die erforderlichen Argumente übergeben wurden. Mit $# zählen Sie alle Argumente; mit $1 greifen Sie auf den Wert des ersten Arguments zu. Mit einer Zählprüfung lässt sich zuverlässig feststellen, ob überhaupt Argumente übergeben wurden; die Prüfung von $1 beantwortet eine andere Frage. Die folgenden Beispiele zeigen, wie Sie diesen Unterschied berücksichtigen, bevor ein Skript mit Arbeiten beginnt, die Benutzereingaben voraussetzen.

Bash-Skriptargumente mit $# zählen

$# wird zur Anzahl der Positionsargumente ausgewertet, die der aktuellen Funktion oder dem Skript übergeben wurden. Es enthält keinen Argumentwert. Wird ein Skript beispielsweise mit ./script.sh eins zwei aufgerufen, beträgt die Anzahl 2; ohne Argumente ist sie 0. Mit $# können Sie also prüfen, wie viele Werte ein Befehl erhalten hat, bevor Sie diese einlesen oder verarbeiten. Innerhalb einer Funktion gilt dasselbe: Dort zählt $# die an diese Funktion übergebenen Argumente.

Führen Sie dieses Beispiel mit drei übergebenen Werten aus:

show_arguments() {
  printf 'Argument count: %s\n' "$#"
  printf 'First argument: %s\n' "$1"
}

show_arguments delft stack blog
Argument count: 3
First argument: delft

Die erste Zeile gibt die Anzahl der Werte aus, die zweite den ersten Wert. Wenn ein Skript mindestens einen Wert benötigt, setzen Sie eine Prüfung vor die Befehle, die die Argumente verwenden. Dieses vollständige Skript verarbeitet die Werte nach der Prüfung und gibt eine verständliche Fehlermeldung aus, wenn keine übergeben wurden:

#!/usr/bin/env bash

require_arguments() {
  if (( $# == 0 )); then
    printf '%s\n' 'No input arguments exist' >&2
    return 1
  fi
}

run_check() {
  if ! require_arguments "$@"; then
    return 1
  fi
  printf 'Received %s argument(s).\n' "$#"
  printf 'First argument: %s\n' "$1"
}

run_check delft
Received 1 argument(s).
First argument: delft

Bei diesem eigenständigen Aufruf wird delft übergeben. Daher besteht der Aufruf die Prüfung und das Skript gibt die Anzahl sowie den ersten Wert aus.

Soll ein Skript stattdessen die tatsächlichen Argumente des Aufrufers prüfen, verwenden Sie run_check "$@" als Einstiegspunkt. Ohne Argumente gibt require_arguments die Meldung No input arguments exist auf der Standardfehlerausgabe aus und liefert 1 zurück. Da run_check damit seinen letzten Befehl mit Rückgabewert 1 beendet, endet auch das Skript mit Status 1. Bei einem oder mehreren Argumenten wird die Prüfung übersprungen. Sie können die Meldung ändern oder eine höhere Mindestanzahl verlangen, zum Beispiel mit (( $# < 2 )), wenn zwei Werte erforderlich sind. Legen Sie die Mindestanzahl anhand dessen fest, was der restliche Skriptcode tatsächlich verwendet, und prüfen Sie die Argumente, bevor Nebenwirkungen auftreten, etwa Dateien erstellt oder Konfigurationen geändert werden.

Beim Aufruf einer Funktion zählt deren $# die Argumente dieser Funktion, nicht die des umgebenden Skripts. Übergeben Sie die Werte ausdrücklich, wenn die Funktion sie benötigt. Das ist hilfreich, wenn ein Skript optionale Flags verarbeitet und anschließend nur ausgewählte Werte an eine Hilfsfunktion weitergibt. Die Anzahl ist numerisch: Bashs arithmetischer Ausdruck (( $# == 0 )) stellt den Vergleich direkt dar und muss nicht den Textinhalt eines Parameters prüfen.

Das erste Bash-Argument mit $1 prüfen

$1 ist der erste Positionsparameter. Zitieren Sie den Wert, wenn Sie ihn prüfen oder ausgeben, zum Beispiel mit [[ -n "$1" ]], um festzustellen, ob er nicht leer ist. Diese Prüfung zeigt nicht, ob überhaupt ein Argument übergeben wurde: Ein Aufrufer kann einen leeren ersten Wert übergeben, etwa mit ./script.sh '', während $# weiterhin 1 ist. Die Position ist also vorhanden, obwohl ihr Wert keine Zeichen enthält. Verwenden Sie die Anzahl, um das Vorhandensein von Argumenten festzustellen, und die Wertprüfung, um deren Inhalt zu prüfen.

Verwenden Sie $#, wenn mindestens ein Argument übergeben worden sein muss. Eine Prüfung von $1 auf einen nicht leeren Wert ist passend, wenn das erste Argument Inhalt haben muss. Die Positionsparameter $1, $2 und $3 stehen für den ersten, zweiten und dritten Wert. Zitieren Sie jeden davon, wenn Sie ihn an einen anderen Befehl übergeben, damit Leerzeichen innerhalb eines Werts erhalten bleiben. Ist der erste Wert beispielsweise North Shore, sorgt "$1" dafür, dass er als ein Wert behandelt wird und die Shell ihn nicht in mehrere Wörter aufteilt.

Wenn beide Bedingungen erfüllt sein müssen, können Sie die Prüfungen kombinieren: Stellen Sie zunächst mit (( $# > 0 )) fest, dass mindestens ein Argument übergeben wurde, und prüfen Sie anschließend mit [[ -n "$1" ]], ob der erste Wert nicht leer ist. Wenn Sie diese Fragen getrennt behandeln, können Sie genauere Fehlermeldungen ausgeben: Das Skript kann melden, dass ein Argument fehlt oder dass der übergebene erste Wert Text enthalten muss. Ist das erste Argument optional, lassen Sie die Zählprüfung weg und legen Sie für den jeweiligen Befehl fest, was ein fehlender Wert bedeutet. In [[ ... ]] empfiehlt sich das Zitieren von $1 weiterhin der Klarheit halber; Wortaufteilung und Dateinamenerweiterung finden innerhalb dieser Bedingungsform jedoch nicht statt. Bei der einfachen Klammerform [ ... ] sollten Sie Erweiterungen wie "$1" zitieren, da ungequotete Erweiterungen eine Wortaufteilung und Dateinamenerweiterung durchlaufen können.