Ich führe ein Skript aus, das das Zeichenfolgenargument übergibt, und ich möchte tun, wenn sonst die folgende Anweisung angezeigt wird:
if [ $1 != '' ] && [ $2 != '' ]
then
do something.....
aber es zeigte sich Error too many argument
. Warum?
command-line
bash
scripts
Taymindis Woon
quelle
quelle
[[ ]]
. Andernfalls müssen Sie Ihre Variablen angeben.$1
könnte vom Benutzer des Skripts deaktiviert oder auf null gesetzt werden. Betrachten Sie diese Befehlsfolge:$ set '' bar
dann werdenecho "x${1}x";
beide Variablen gesetzt, aber eine von ihnen ist null.Antworten:
Versuchen Sie es mit dem -z-Test:
Vom Menschen
bash
:quelle
Da dies markiert ist
bash
, empfehle ich, das erweiterte Testkonstrukt ([[...]]
) zu verwenden und die Anführungszeichen zu vergessen:Sofern Sie nicht auf
sh
/ POSIX-Kompatibilität aus sind, gibt es keinen Grund, diese nicht zu verwenden[[ ]]
.quelle
Folgendes funktioniert auch,
quelle
&&
und andere Trennzeichen für logische Befehle sind im Klassiker nicht zulässigtest
. Sie müssen stattdessen andere Testkonstrukte verwenden (wie-a
ich denke)Die alte Version der Antwort finden Sie im zweiten Teil dieser Antwort. Wenn Sie Einzelheiten erfahren möchten, lesen Sie weiter
Die Ursache des Problems
In der Frage selbst wird berichtet, dass OP sieht
too many arguments error
, was beim Testenbash
nicht der Fall zu sein scheint:Mit
/bin/sh
dem Symlink tatsächlich/bin/dash
auf Ubuntu, berichteten Fehler wie folgt:Und der Standalone
/bin/test
auch:Anmerkung: Wenn Sie sich fragen, was ist
/usr/bin/test
und warum ichbash
und verwendesh
, sollten Sie wissen, dass dies[
ein Alias für dentest
Befehl ist, der auch als eigenständige ausführbare Datei oder häufiger vorhanden ist - als integrierte Shell, die von jeder Shell zuerst verwendet wird . Wie fürif
Aussagen, arbeiten sie an der Ausfahrt Statuen von Befehlen, also warum[
undtest
sind Befehle, mit allem anderen sind Argumente , die Befehle - falsche Reihenfolge dieser Befehlszeilen args führt zu Fehlern.Zurück zum Thema: Es ist unklar, wie OP zu dem Fehler kam, der nicht damit zusammenhängt. In allen drei Fällen ist das Problem jedoch dasselbe - nicht festgelegte Variablen werden als leer behandelt, was die Shell also mit diesen nicht angegebenen Variablen sieht
das bricht die Syntax, die
test
versteht. Erinnern Sie sich, was ich über die falsche Reihenfolge der Befehlszeilenargumente gesagt habe? Daher ist das Zitieren wichtig. Lassen Sie uns die Diagnoseausgabe aktivieren und sehen, was die Shell ausführt:Besserer Weg, um nicht gesetzte Variablen zu testen
Ein sehr häufiger Ansatz, den Sie sehen, ist folgender:
Um Gilles zu zitieren :
Vermutlich sollte dies ziemlich portabel sein, da ich diese in
/bin/sh
Skripten gesehen habe. Es kann auch wie in kombiniert werdenNatürlich könnten wir die
-z
Flagge benutzen , aber laut Recherchen in einigen Shells, insbesondere ksh88 (laut Stephane Chazelas ), ist diese Flagge fehlerhaft.Siehe auch
\[
vs\[\[
vs((
quelle
Ich denke, der Titel des Beitrags ist nicht korrekt, da die Absicht in der Nachricht war, zu überprüfen, ob $ 1 und $ 2 nicht null sind. Im angegebenen Beispiel fehlten lediglich doppelte Anführungszeichen in $ 1 und $ 2, um zu funktionieren. Variablen müssen in doppelte Anführungszeichen gesetzt werden, um beim Vergleichen von Zeichenfolgen erweitert zu werden. Aber zu prüfen, ob $ 1 und $ 2 existieren, ist dasselbe wie zu prüfen, ob $ 2 existieren, da es nicht existieren kann, wenn $ 1 nicht existiert. Der Befehl 'if' wird auch in diesem Fall nicht benötigt, da 'test' true / false zurückgibt und '&&' als 'then' verwendet, wenn return 0 / true ist:
Einfacher mit -n (ungleich Null):
Das Überprüfen, ob $ 1 und $ 2 null sind, entspricht dem Überprüfen, ob kein Parameter vorhanden ist:
quelle