Ich konnte keine einfache Ressource finden, die die Bedeutung des folgenden BASH-Shell-Fehlers beschreibt und behebt. Daher veröffentliche ich das, was ich nach der Recherche gefunden habe.
Der Fehler:
-bash: [: too many arguments
Google-freundliche Version : bash open square bracket colon too many arguments
.
Kontext: Eine if-Bedingung in einzelnen eckigen Klammern mit einem einfachen Vergleichsoperator wie gleich, größer als usw., zum Beispiel:
VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
# some action
fi
bash
if-statement
arguments
user56reinstatemonica8
quelle
quelle
Antworten:
Wenn
$VARIABLE
es sich um eine Zeichenfolge handelt, die Leerzeichen oder andere Sonderzeichen enthält, und einzelne eckige Klammern verwendet werden (dies ist eine Verknüpfung für dentest
Befehl), kann die Zeichenfolge in mehrere Wörter aufgeteilt werden. Jedes dieser Argumente wird als separates Argument behandelt.Damit eine Variable in viele Argumente aufgeteilt wird :
Gleiches gilt für jeden Funktionsaufruf, der eine Zeichenfolge mit Leerzeichen oder anderen Sonderzeichen aufgibt.
Einfache Lösung
Schließen Sie die Variablenausgabe in doppelte Anführungszeichen ein und zwingen Sie sie, als eine Zeichenfolge zu bleiben (daher ein Argument). Beispielsweise,
So einfach ist das. Fahren Sie jedoch mit "Auch Vorsicht ..." fort, wenn Sie nicht garantieren können, dass Ihre Variable keine leere Zeichenfolge oder eine Zeichenfolge ist, die nur Leerzeichen enthält.
Oder ein alternatives fix ist doppelt eckige Klammern zu verwenden (was eine Abkürzung für den IS -
new test
Befehl).Dies existiert jedoch nur in Bash (und anscheinend in Korn und Zsh) und ist daher möglicherweise nicht mit Standard-Shells kompatibel, die von
/bin/sh
usw. aufgerufen werden .Dies bedeutet, dass es auf einigen Systemen möglicherweise von der Konsole aus
cron
funktioniert, jedoch nicht, wenn es an einer anderen Stelle aufgerufen wird, z. B. von , je nachdem, wie alles konfiguriert ist.Es würde so aussehen:
Wenn Ihr Befehl doppelte eckige Klammern wie diese enthält und Sie Fehler in den Protokollen erhalten, diese jedoch über die Konsole funktionieren, versuchen Sie, die
[[
gegen eine hier vorgeschlagene Alternative auszutauschen, oder stellen Sie sicher, dass für die Ausführung Ihres Skripts eine Shell verwendet wird, die[[
aka unterstütztnew test
.Achten Sie auch auf den
[: unary operator expected
FehlerWenn der Fehler "Zu viele Argumente" angezeigt wird, erhalten Sie wahrscheinlich eine Zeichenfolge von einer Funktion mit unvorhersehbarer Ausgabe. Wenn es auch möglich ist, eine leere Zeichenfolge (oder alle Leerzeichen) abzurufen, wird dies selbst mit der obigen "Schnellkorrektur" als Nullargument behandelt und schlägt fehl
[: unary operator expected
Es ist das gleiche "Gotcha", wenn Sie an andere Sprachen gewöhnt sind - Sie erwarten nicht, dass der Inhalt einer Variablen effektiv in den Code wie dieser gedruckt wird, bevor er ausgewertet wird.
Hier ist ein Beispiel, das sowohl die
[: too many arguments
als auch die[: unary operator expected
Fehler verhindert: Ersetzen der Ausgabe durch einen Standardwert, wenn sie leer ist (in diesem Beispiel0
), mit doppelten Anführungszeichen um das Ganze:(Hier wird die Aktion ausgeführt, wenn $ VARIABLE 0 oder leer ist. Natürlich sollten Sie die 0 (den Standardwert) in einen anderen Standardwert ändern, wenn ein anderes Verhalten gewünscht wird.)
Schlussbemerkung: Da
[
es sich um eine Verknüpfung für handelttest
, gilt alles oben Genannte auch für den Fehlertest: too many arguments
(und auchtest: unary operator expected
)quelle
i=$(some_command); i=$((i)); if [ "$i" == 0 ] ...
Ich bin gerade auf diesen Beitrag gestoßen, indem ich den gleichen Fehler erhalten habe und versucht habe zu testen, ob zwei Variablen beide leer (oder nicht leer) sind. Das stellt sich als zusammengesetzter Vergleich heraus - 7.3. Andere Vergleichsoperatoren - Advanced Bash-Scripting Guide ; und ich dachte, ich sollte folgendes beachten:
dachte immer, es bedeutet "leer". aber das bedeutet "Datei existiert" --e
-z
zum Testen der leeren Variablen (Zeichenfolge)test
s und&&
sie:[ ... ] && [ ... ]
-a
Operator in einem einzigentest
:[ ... -a ... ]
Hier ist ein funktionierender Befehl (Durchsuchen aller txt-Dateien in einem Verzeichnis und Speichern der gefundenen Dateien
grep
enthält beide Wörter):Edit 12 Aug 2013: Zugehöriger Problemhinweis:
Beachten Sie, dass , wenn Zeichenfolge Gleichheit mit klassischen Prüfung
test
(Einzel eckige Klammer[
), man muss einen Raum zwischen dem „gleich“ Betreiber haben, die in diesem Fall eine einzige ist „gleich“=
Zeichen (obwohl zwei Gleichen Zeichen==
scheinen , als Gleichheit in Kauf genommen werden Betreiber auch). Dies schlägt also (lautlos) fehl:... aber füge den Platz hinzu - und alles sieht gut aus:
quelle
((A || B) && C)
?Ein weiteres Szenario, das Sie
[: too many arguments
oder[: a: binary operator expected
Fehler erhalten können, ist, wenn Sie versuchen, alle Argumente zu testen"$@"
Es funktioniert richtig, wenn Sie anrufen
foo.sh
oderfoo.sh arg1
. Wenn Sie jedoch mehrere Argumente wie übergebenfoo.sh arg1 arg2
, erhalten Sie Fehler. Dies liegt daran, dass es erweitert wird[ -z arg1 arg2 ]
, was keine gültige Syntax ist.Der richtige Weg, um das Vorhandensein von Argumenten zu überprüfen, ist
[ "$#" -eq 0 ]
. ($#
ist die Anzahl der Argumente).quelle
Einige Male Wenn Sie versehentlich die Tastatur berühren und ein Leerzeichen entfernen.
Löst diese Fehlermeldung aus. Beachten Sie das Leerzeichen vor ']'.
quelle
Ich hatte das gleiche Problem mit meinen Skripten. Aber als ich einige Modifikationen vorgenommen habe, hat es bei mir funktioniert. Mir hat das gefallen: -
Auf diese Weise habe ich mein Problem gelöst. Hoffe das hilft dir auch.
quelle