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 bashnicht der Fall zu sein scheint:
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
Mit /bin/shdem Symlink tatsächlich /bin/dashauf Ubuntu, berichteten Fehler wie folgt:
$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator
Und der Standalone /bin/testauch:
$ /usr/bin/test $1 != ''
/usr/bin/test: missing argument after ‘’
Anmerkung: Wenn Sie sich fragen, was ist /usr/bin/testund warum ich bashund verwende sh, sollten Sie wissen, dass dies [ein Alias für den testBefehl 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 ifAussagen, arbeiten sie an der Ausfahrt Statuen von Befehlen, also warum [und testsind 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 testversteht. 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/shSkripten gesehen habe. Es kann auch wie in kombiniert werden
if [ "x${var1}${var2}" == "x" ]; then
...
fi
Natürlich könnten wir die -zFlagge benutzen , aber laut Recherchen in einigen Shells, insbesondere ksh88 (laut Stephane Chazelas ), ist diese Flagge fehlerhaft.
Siehe auch