it-swarm.com.de

Wie überprüfe ich, ob $ 1 und $ 2 null sind?

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 Error too many argument. Warum?

40
taymindis Woon

Versuchen Sie es mit dem -z-Test:

if [ -z "$1" ] && [ -z "$2" ]

Vom Menschen bash:

-z string
   True if the length of string is zero.
53
Sylvain Pineau

Da dies mit bash markiert ist, empfehle ich, das erweitertes Testkonstrukt ([[...]]) zu verwenden und die Anführungszeichen zu vergessen:

if [[ -z $1 && -z $2 ]]; then
...

Sofern Sie nicht auf sh/POSIX-Kompatibilität setzen, gibt es keinen Grund, [[ ]] nicht zu verwenden.

13
muru

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 too many arguments error sieht, was beim Testen in bash nicht der Fall zu sein scheint:

$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected

Bei /bin/sh, das tatsächlich mit /bin/dash auf Ubuntu verknüpft ist, wurde der Fehler wie folgt gemeldet:

$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator

Und der Standalone /bin/test auch:

$ /usr/bin/test $1 != ''  
/usr/bin/test: missing argument after ‘’

Anmerkung: Wenn Sie sich fragen, was /usr/bin/test ist und warum ich bash und sh verwende, sollten Sie wissen, dass [ ein Alias ​​für test ist. Befehl, der auch als eigenständige ausführbare Datei oder häufiger vorhanden ist - als integrierte Shell, die zuerst von jeder Shell verwendet wird. Die if -Anweisungen verarbeiten Exit-Statuen von Befehlen, weshalb [ und test Befehle sind, wobei alles andere Argumente für diese Befehle sind - falsche Reihenfolge dieser Befehlszeilenargumente führt zu Fehlern.

Zurück zum Thema: Es ist unklar, wie OP zu dem Fehler kam, der nichts damit zu tun hat. 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 Shell ausführt:

$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ] 
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars

Besserer Weg, um nicht gesetzte Variablen zu testen

Ein sehr häufiger Ansatz, den Sie sehen, ist folgender:

 if [ "x$var1" == "x"  ] && [ "x$var2" == "x"  ];                                                                
 then
     echo "both variables are null"
 fi

Um Gilles zu zitieren:

In ["x $ 1" = "x"] stellt das x-Präfix sicher, dass x "$ 1" möglicherweise nicht wie ein Operator aussehen kann. Die Shell kann diesen Test also nur analysieren, indem sie = als binären Operator behandelt.

Vermutlich sollte dies ziemlich portabel sein, da ich diese in /bin/sh Skripten gesehen habe. Es kann auch wie in kombiniert werden

if [ "x${var1}${var2}" == "x" ]; then
    ...
fi

Natürlich könnten wir die -z -Flagge verwenden, jedoch laut Recherchen in einigen Shells, insbesondere ksh88 (laut Stephane Chazelas ), ist diese Flagge fehlerhaft.

Siehe auch

3

Folgendes funktioniert auch,

if [ "$1" == "" && "$2" == ""]; then
    echo NULL
fi
3
Avinash Raj

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:

[ "$2" != '' ] && commands...

Einfacher mit -n (ungleich Null):

[ -n "$2" ] && commands...

Das Überprüfen, ob $ 1 und $ 2 null sind, entspricht dem Überprüfen, ob kein Parameter vorhanden ist:

[ $# -eq 0 ] && commands...
1
Guariba Som