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 Testen bash
nicht der Fall zu sein scheint:
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
Mit /bin/sh
dem Symlink tatsächlich /bin/dash
auf Ubuntu, berichteten Fehler wie folgt:
$ 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 ist /usr/bin/test
und warum ich bash
und verwende sh
, sollten Sie wissen, dass dies [
ein Alias für den test
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ür if
Aussagen, arbeiten sie an der Ausfahrt Statuen von Befehlen, also warum [
und test
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:
$ 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 benutzen , aber laut Recherchen in einigen Shells, insbesondere ksh88 (laut Stephane Chazelas ), ist diese Flagge fehlerhaft.
Siehe auch