Fehler "unärer Operator erwartet" in Bash, wenn Bedingung


225

Ich habe versucht herauszufinden, was daran falsch ist, kann es aber einfach nicht herausfinden.

Dies ist der Teil scheint einen Fehler zu bekommen ..

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

Ich bekomme diesen Fehler:

calc_1.2: line 75: [: =: unary operator expected

4
Ich denke, Ihre ifAussage in Zeile 75 braucht a fi.
Steve

7
Wenn Sie Zweifel haben, zitieren Sie vars.
Koola

9
@koola, 'immer' zitiere vars.
CousinCocaine

Antworten:


480

Wenn Sie wissen, dass Sie immer bash verwenden werden, ist es viel einfacher [[ ... ]], anstelle der Posix-kompatiblen Einzelklammerversion immer den bedingten zusammengesetzten Doppelklammerbefehl zu verwenden [ ... ]. Innerhalb einer [[ ... ]]Verbindung werden Wortaufteilung und Pfadnamenerweiterung nicht auf Wörter angewendet, sodass Sie sich darauf verlassen können

if [[ $aug1 == "and" ]];

um den Wert von $aug1mit der Zeichenfolge zu vergleichen and.

Wenn Sie verwenden [ ... ], müssen Sie immer daran denken, Variablen wie diese in doppelte Anführungszeichen zu setzen:

if [ "$aug1" = "and" ];

Wenn Sie die Variablenerweiterung nicht zitieren und die Variable undefiniert oder leer ist, verschwindet sie vom Tatort und bleibt nur übrig

if [ = "and" ]; 

Das ist keine gültige Syntax. (Es würde auch mit einer anderen Fehlermeldung fehlschlagen, wenn $aug1Leerzeichen oder Shell-Metazeichen enthalten wären .)

Der moderne [[Operator verfügt über viele weitere nützliche Funktionen, einschließlich der Anpassung regulärer Ausdrücke.


9
"modern"? War nicht immer in Bash? Es ist seit über zwanzig Jahren in Korn Shell und datiert Bash vor. (Ich weiß, was du meinst)
Cdarke

31

Ich habe eine Weile gebraucht, um dies zu finden, aber beachten Sie, dass bei einem Abstandsfehler auch derselbe Fehler angezeigt wird:

[: =: unary operator expected

Richtig:

if [ "$APP_ENV" = "staging" ]

vs.

if ["$APP_ENV" = "staging" ]

Wie immer -xhilft das Setzen der Debug-Variablen, diese zu finden:

set -x

Jemand hat mir diesen Fehler in einem Build-Skript hinterlassen. Hat mir etwas Zeit gespart, danke!
Kyle

8

Versuchen Sie, einen Wert zuzuweisen, $aug1bevor Sie ihn in if[]Anweisungen verwenden. Die Fehlermeldung verschwindet danach.


0

du sagst ... :

elif [$ operation = "man"]; dann wenn [$ aug1 = "add"]; dann # <- Zeile 75 echo "Man Page for: add" echo "" echo "Syntax: add [Nummer 1] [Nummer 2]" echo "" echo "Beschreibung:" echo "Addiere zwei verschiedene Zahlen zusammen." echo "" echo "Info:" echo "Hinzugefügt in v1.0" echo "" elif [-z $ aug1]; dann echo "Bitte geben Sie einen Befehl zum Lesen der Manpage an." sonst echo "Es gibt keine Handbuchseite für diesen Befehl." fi

Ich denke, es ist nur der Raum ... mach das so:

elif [$operation = "man"]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [-z $aug1]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

-11

Sie können auch einen Standardwert für die Variable festlegen, sodass Sie nicht zwei "[" verwenden müssen, was zwei Prozessen entspricht ("[" ist eigentlich ein Programm) anstelle von einem.

Es folgt dieser Syntax: $ {VARIABLE: -default}.

Das Ganze muss so gedacht werden, dass dieser "Standard" -Wert etwas anderes ist als ein "gültiger" Wert / Inhalt.

Wenn dies aus irgendeinem Grund nicht möglich ist, müssen Sie wahrscheinlich einen Schritt hinzufügen, z. B. prüfen, ob überhaupt ein Wert vorhanden ist, wie z. B. "if [-z $ VARIABLE]; dann echo" die Variable muss gefüllt werden "" oder " Wenn [! -z $ VARIABLE]; dann ist # alles in Ordnung, fahren Sie mit dem Rest des Skripts fort ".


3
[[erzeugt nicht zwei Prozesse, sondern ist eine eingebaute Shell (und auch [eine eingebaute Bash). [[unterscheidet sich von [ [, was die zweite [als Zeichenfolge behandelt
user123444555621
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.