Wie überprüfe ich, ob für einen Befehl keine Parameter angegeben wurden?

74

Wie prüft man, ob $*leer ist? Mit anderen Worten, wie kann geprüft werden, ob für einen Befehl keine Argumente angegeben wurden?

Naja eigentlich
quelle

Antworten:

111

Um zu überprüfen, ob für den Befehl keine Argumente angegeben wurden, überprüfen Sie den Wert der $#Variablen.

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi

Wenn Sie verwenden möchten $*( nicht bevorzugt ), dann

if [ "$*" == "" ]; then
    echo "No arguments provided"
    exit 1
fi

Einige Erklärungen:

Der zweite Ansatz ist nicht vorzuziehen, da die Erweiterung *der Positionsparameter von eins ausgehend auf die Positionsparameter ausgedehnt wird. Wenn die Erweiterung in doppelten Anführungszeichen erfolgt, wird sie zu einem einzelnen Wort erweitert, wobei der Wert jedes Parameters durch das erste Zeichen der IFS-Sondervariablen getrennt wird. Das bedeutet, dass eine Zeichenfolge erstellt wird. Es entsteht also zusätzlicher Overhead.

Zum anderen #erweitert sich die Anzahl der Positionsparameter.

Beispiel:

$ command param1 param2

Hier,

Der Wert von $#ist 2 und der Wert von $*ist der String "param1 param2" (ohne Anführungszeichen), wenn IFS nicht gesetzt ist. Wenn IFS nicht gesetzt ist, werden die Parameter durch Leerzeichen getrennt

Weitere Informationen finden man bashSie unter dem Thema " Spezielle Parameter"

Sachin Divekar
quelle
5
Oder if ! (($#)); ..., oder if (($# == 0)); ..., oder if [ $# -eq 0 ]; ..., oder ! (($#)) && ..., oder(($#)) || ...
nicerobot
7
[ $# -eq 0 ]ist die häufigste Form von IME. Es gibt Randfälle, in denen "$#"leer sein kann: Wenn es ein einzelnes Argument gibt, das leer ist, oder wenn es mehrere leere Argumente gibt und $IFSleer ist.
Gilles
1
Der "$*"Ausdruck wird auch ausgewertet, ""wenn nur ein ""Parameter übergeben wurde. Aber die meiste Zeit werden Sie wahrscheinlich sowieso nicht interessieren.
manatwork
Ich glaube, es sollte = statt == sein ... momentan erhalte ich einen unerwarteten Bedienerfehler, und das Ändern zu = behebt das Problem.
eigentlich
@Charlotte Das bedeutet, dass Sie nicht verwenden bash. Sie verwenden sh, um das Skript auszuführen. AFAIK ==ist nur gültig in bash.
Sachin Divekar
14

Wenn Sie nur dann auf Kaution gehen möchten, wenn ein bestimmtes Argument fehlt, ist die Parametersubstitution großartig:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
Klopfen
quelle
-4

Auf diese Weise können Sie feststellen, dass Sie keine Argumente haben

NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
    {do something}
fi
Joel Dsouza
quelle
5
Das scheint eine verschlungene Methode zu sein, um das zu tun, was die akzeptierte Antwort vor 5 Jahren schrieb ....
Jeff Schaller