Anzahl der an ein Bash-Skript übergebenen Argumente prüfen

Ich möchte, dass mein Bash-Skript eine Fehlermeldung ausgibt, wenn die erforderliche Anzahl von Argumenten nicht erfüllt ist.

Ich habe den folgenden Code ausprobiert:

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

Aus irgendeinem unbekannten Grund habe ich den folgenden Fehler erhalten:

test: line 4: [2: command not found

Was mache ich falsch?

Lösung

Genau wie jeder andere einfache Befehl erfordert [ ... ] oder test Leerzeichen zwischen seinen Argumenten.

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

Oder

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

Vorschläge

Verwenden Sie in der Bash stattdessen lieber [[ ]], da sie keine Worttrennung und Pfadnamen-Expansion für ihre Variablen vornimmt, so dass eine Quotierung nicht unbedingt notwendig ist, es sei denn, sie ist Teil eines Ausdrucks.

[[ $# -ne 1 ]]

Es hat auch einige andere Funktionen wie unquoted condition grouping, pattern matching (extended pattern matching mit extglob) und regex matching.

Das folgende Beispiel prüft, ob die Argumente gültig sind. Es erlaubt ein einzelnes Argument oder zwei.

[[ ($# -eq 1 || ($# -eq 2 && $2 == )) && $1 =~  ]]

Für rein arithmetische Ausdrücke mag die Verwendung von (( )) für einige immer noch besser sein, aber sie sind auch in [[ ]] mit seinen arithmetischen Operatoren wie -eq, -ne, -lt, -le, -gt oder -ge möglich, indem der Ausdruck als einzelnes String-Argument gesetzt wird:

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

Das sollte hilfreich sein, wenn man es auch mit anderen Funktionen von [[ ]] kombinieren möchte.

Beenden des Skripts

Es ist auch logisch, das Skript zu beenden, wenn ungültige Parameter an es übergeben werden. Dies wurde bereits in den [comments] (https://stackoverflow.com/questions/18568706/check-number-of-arguments-passed-to-a-bash-script#comment50847987_18568706) von [ekangas] (https://stackoverflow.com/users/1102730/ekangas) vorgeschlagen, aber jemand hat diese Antwort bearbeitet, um sie mit -1 als Rückgabewert zu versehen, also kann ich es auch gleich richtig machen.

Obwohl -1 von der Bash als Argument für exit akzeptiert wird, ist es nicht explizit dokumentiert und sollte nicht als allgemeiner Vorschlag verwendet werden. 64 ist auch der formalste Wert, da er in sysexits.h mit #define EX_USAGE 64 /* command line usage error */ definiert ist. Die meisten Werkzeuge wie ls geben bei ungültigen Argumenten ebenfalls 2 zurück. Ich habe in meinen Skripten auch 2 zurückgegeben, aber in letzter Zeit habe ich mich nicht mehr darum gekümmert und einfach 1 in allen Fehlern verwendet. Aber lassen Sie uns einfach 2 hier einfügen, da es am häufigsten vorkommt und wahrscheinlich nicht OS-spezifisch ist.

if [[ $# -ne 1 ]]; then
    echo "Illegal number of parameters"
    exit 2
fi

Referenzen

Kommentare (2)

Es könnte eine gute Idee sein, arithmetische Ausdrücke zu verwenden, wenn Sie mit Zahlen zu tun haben.

if (( $# != 1 )); then
    echo "Illegal number of parameters"
fi
Kommentare (0)

Auf []: !=, =, == ... sind String-Vergleichsoperatoren und -eq, -gt ... sind arithmetische binäre Operatoren.

Ich würde verwenden:

if [ "$#" != "1" ]; then

Oder:

if [ $# -eq 1 ]; then
Kommentare (3)