Hi Ronny,

On Wed, Jan 18, 2012 at 18:42:53 +0100, Ronny Seffner wrote:

> LEFT="yes"
> RIGHT=""
> 
> if [ $LEFT = "yes" ] && [ -z $RIGHT ]; then ...
> 
> allerdings wirft das den Fehler:
> 
> -bash: [: =: Einstelliger (unärer) Operator erwartet.
> 
> Was habe ich nicht verstanden?

Du solltest in beiden Tests die Variablenexpansion quoten, damit dort
jeweils ein Argument rauskommt. Also:
  if [ "$LEFT" = "yes" ] && [ -z "$RIGHT" ]; ...

Sonst bekommst Du folgende Probleme:

1.

LEFT=""
if [ $LEFT = "yes" ] && [ -z $RIGHT ]; ...

[: =: unary operator expected

Hier expandiert $LEFT zu _nichts_, also noch nicht mal zu einem leeren
Argument. Deshalb beschwert sich das test-Kommando ([), dass bei einer
Folge von Operator (=) und Operand ("yes") der Operator ein unaerer sein
muss. Der Gleichheitsoperator ist aber ein binaerer (will zwei Argumente).

2.

LEFT="yes sir"
if [ $LEFT = "yes" ] && [ -z $RIGHT ]; ...

[: too many arguments

Hier expandiert $LEFT zu yes sir, also zu zwei Argumenten. Das
test-Kommando will nach einem Argument auf jeden Fall einen Operator
als naechstes Argument sehen und keinen weiteren nicht-Operator.

3.

LEFT="yes"
RIGHT="we can"
if [ $LEFT = "yes" ] && [ -z $RIGHT ]; ...

[: we: binary operator expected

Die Shell expandiert $RIGHT zu we can, also wieder zwei Argumente.
Hier haette ich eigentlich auch "too many arguments" erwartet :)
Anscheinend zaehlt test alle Argumente und guckt sich dann den
Operator an. Da -z ein unaerer Operator ist, passt ihm das nicht.


Uebrigens: Weder "[ ... ]" noch "&&" gehoeren zur Syntax von "if".

"[" ist ein eigenstaendiges Kommando und heisst eigentlich "test".
Es prueft Bedingungen (Ausdruecke) und gibt das Ergebnis als Exit Status
zurueck. Beispiele:

  test a = a            ([ a = a ] ist das Gleiche)
  echo $?               (Exit Status 0, wahr)
  [ "bla" = "blubb" ]   (ja, eckige Klammer auf ist ein Kommando, eckige
                        Klammer zu wird in diesem Fall als Abschluss
                        erwartet)
  echo $?               (Exit Status 1, falsch)

"&&" ist ein Konstrukt zum Verketten von Kommandos. Das Kommando links
von && wird ausgefuehrt. Wenn dessen Exit Status 0 ist, wird auch das
Kommando rechts von && ausgefuehrt. Beispiel:

  ping -c2 8.8.8.8 && echo "google dns is reachable"

"if" fuehrt das nachfolgende als Kommando aus und prueft den Exit
Status. Ist dieser 0 (okay), wird der von "then" ... "fi" geklammerte
Block ausgefuehrt. Beispiel:

  if grep -wq swap /etc/fstab ; then
    echo "swap found in fstab"
    touch /var/log/swap_last_found
  fi


Gruss,
  Chris
-- 
Christian Perle                                    chris AT linuxinfotag.de
010111                                              http://chris.silmor.de/
101010                          LinuxGuitarKitesBicyclesBeerPizzaRaytracing

_______________________________________________
Lug-dd maillist  -  [email protected]
https://ssl.schlittermann.de/mailman/listinfo/lug-dd

Antwort per Email an