# Warum wird dieses if Statement nicht richtig ausgewertet?

## Flasher

Hallo!

Ich übe mich zur Zeit gerade ein bisschen in Linux-Shell-Programmierung und baue mir ein Login Script. 

Dazu habe ich mir schon eine ganz gute Anleitung gegooglet http://www.linux-services.org/shell/#SECTION00390000000000000000

Aber leider wird mein if-statement nicht richtig ausgwertet. Vielleicht kann jemand einen Hinweis geben.

Ich habe eine Variable username. Diese ist mit dem aktuell eingeloggten Benutzer vorbelegt.

Nun möchte ich einfach in der If Bedingung abfragen, ob ein bestimmter Wert in der Variable steht:

```
if ($username==andreas) || ($username==veronika) || ($username==elke) || ($username==franz-ludwig)

   then

      //Es gibt viel zu tun

   fi
```

Leider kriege ich auf der console nur folgende Fehlermeldung:

```
./logon_linux_absolut: 58: andreas==andreas: not found

./logon_linux_absolut: 58: andreas==veronika: not found

./logon_linux_absolut: 58: andreas==elke: not found

./logon_linux_absolut: 58: andreas==franz-ludwig: not found

```

Woran liegt denn das?

Für eure Hilfe danke ich euch!

Grüße,

Flasher

----------

## Polynomial-C

Hi,

du hast die falschen Klammern verwendet.

Statt 

```
if ($username==andreas) || ($username==veronika) || ($username==elke) || ($username==franz-ludwig)
```

sollte da 

```
if [ "$username" == "andreas" ] || [ "$username" == "veronika" ] || [ "$username" == "elke" ] || [ "$username" == "franz-ludwig" ]
```

stehen, dann müßte es funktionieren.

Du kannst allerdings auch alles in eine [] Anweisung stecken: 

```
if [ "$username" == "andreas" -o "$username" == "veronika" -o "$username" == "elke" -o "$username" == "franz-ludwig" ]
```

Grüße

Poly-C

P.S.: Ich bin jetzt mal davon ausgegangen, daß du /bin/bash als shellinterpreter verwendest. Falls nicht, kann es sein, daß meine Vorschläge nicht funktionieren.

----------

## mv

 *Polynomial-C wrote:*   

> 
> 
> ```
> if [ "$username" == "andreas" ] || ...
> ```
> ...

 

Und wenn man dann = statt == schreibt, geht es auf jeder POSIX-Shell (z.B. auch dash) und nicht nur in der Bash.

```
if [ "$username" == "andreas" -o "$username" == "veronika" -o "$username" == "elke" -o "$username" == "franz-ludwig" ]
```

Die Benutzung von -o und -a ist generell eine schlechte Idee, weil das Verhalten dann grundsätzlich nicht definiert ist. Wenn beispielsweise username=! ist, bringt selbst die Bash hier einen Fehler. Man könnte zwar den Bashismus [[ ... || ... ]] bemühen, aber besser gleich kompatibler programmieren mit [ ... ] || [ ... ]

Edit: Ach ja, bequemer geht das Ganze vielleicht mit 

```
case "$username" in

  andreas|veronika|elke|franz-ludwig) ...

  ;;

  *) ... # else..., falls gewünscht

  ;;

esac
```

----------

## Flasher

Danke schonmal für eure super Hilfe!

Jetzt hänge ich bloß noch an einer Stelle:

```
if [ !(grep //homeserver/archive /proc/mounts) ] && [ "$username" = "andreas" ]
```

Warum funktioniert dieser Ausdruck nicht?

Er soll in "then" reingehen, wenn der String "//homeserver/archive" in /proc/mounts nicht gefunden wird UND "$username" = "andreas".

Aber irgendwie mag er meine Negation nicht. Ich habe da jetzt schon mit verschiedenen Klammerausdrücken rumgespielt, aber bisher klappt nichts!

Grüße,

Flasher

----------

## mv

 *Flasher wrote:*   

> 
> 
> ```
> if [ !(grep //homeserver/archive /proc/mounts) ] && [ "$username" = "andreas" ]
> ```
> ...

 

Du musst Dir klarmachen, dass if beliebige Kommandos (sogar Pipelines) schluckt und nur deren Return-Wert auswertet. '[' ist nur ein spezielles Kommando, das man jederzeit (auch außerhalb von if) benutzen kann:

```
if ! grep //homeserver/archive /proc/mounts && [ "$username" = 'andreas' ]; then

  tuwas

fi
```

Um Dir nochmal klarzumachen, dass '[' mit if nichts zu tun hat, hier noch einmal das selbe Beispiel mit anderer Syntax:

```
if ! grep //homeserver/archive /proc/mounts && test "$username" = 'andreas'; then

  tuwas

fi
```

 Und nochmal das Ganze ohne if: 

```
! grep //homeserver/archive /proc/mounts && [ "$username" = 'andreas' ] && {

  tuwas

}
```

Beachte bitte bei diesen Beispielen, dass sie in der interaktiven Shell nicht gehen, weil "!" dort die History-Expansion aktiviert...

----------

## Flasher

@ mv

Vielen Dank! Jetzt habe ich das ganz schon wesentlich besser verstanden! Die Linux Shell Programmierung scheint wohl mächtiger zu sein, als ich auf den ersten Blick vermutet habe   :Wink: 

Ich bin bisher nur C/C++ und Java gewohnt.

Grüße,

Flasher

----------

## Jointy

Warum erzählt ihm blos keiner das die [] nur ne andere schreibweise des test commands sind.

```

man test

```

Hilft dir da gerne weiter.

MsG

j0inty.sL

----------

