• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Schwierigkeiten bei IF Anweisung

texus

Member
Hallo !
Ich möchte in meinem Bashskript eine if-Anweisung verwenden die durch ODER Verknüpft 3 Sachen Prüft:

Bsp:
Code:
IF [ $wert = "1" ] || [$wert = "2"] || [$wert = "3"]; then
 echo "......usw"
else
 echo ".... use"
fi

Das ober Konstrukt erzeugt zwar keine Fehler, macht abwer leider auch nicht was es soll.

MfG
texus
 
A

Anonymous

Gast
texus schrieb:
IF [ $wert = "1" ] || [$wert = "2"] || [$wert = "3"]; then
probier mal
Code:
if [ $wert = "1" ] || [ $wert = "2" ] || [ $wert = "3" ]; then
ansonsten Klammern
Code:
if ( [ $wert = "1" ] || [ $wert = "2" ] ) || [ $wert = "3" ]; then

hab gerade keine bash zur Hand zum probieren

robi
 
OP
T

texus

Member
Hallo !
Danke für die schnelle Antwort.

Vers.2 (mit den Klammern) funzt leider auch nicht.
Bei deiner Version 1 hab ich keinen Unterschied zu meiner Anweisung feststellen können. Hab ich da was übersehen ?

P.S Vielleicht nicht unwichtig. Egal was ich eingebe. Er führt immer den IF Zweig aus nicht den Else.

MfG
texus
 

regexer

Advanced Hacker
texus schrieb:
Bei deiner Version 1 hab ich keinen Unterschied zu meiner Anweisung feststellen können. Hab ich da was übersehen ?
Ja, du hast was übersehen ;) Und zwar die Spaces vor und nach den eckigen klammern. Zumindest bei meiner Bash-Version (3.1) ist das wichtig! Und das if ist kleingeschrieben.
Außerdem sollte man "$wert" in doppelte Anführungszeichen setzen. Nur für den Fall, dass $wert leer ist ...
 
A

Anonymous

Gast
hast du jeweils rechts und links der eckigen Klammer Leerzeichen ???

robi
 
OP
T

texus

Member
Entschuldigung für den schludrigen Post.
Hier mal mein richtiges testskript.

Code:
#!/bin/bash
echo $1
val=$1
echo $val
if [ "$val" != "test1" ] || [ "$val" != "test2" ] || [ "$val" != "test3" ]
then
        echo " Wert ungleich test1,2 oder 3"
else
        echo "Wert test1,2,oder 3 eingegeben $val"
fi

Vor und nach den eckigen Klammern ist ein Leerzeichen.

Wenn ich die beiden ODER-Verknüpfungen weglasse, dann stimmt die Auswertung des ersten Ausdrucks. Nur scheint er das ODER nicht als solches zu nehmen.

MfG
texus
 
A

Anonymous

Gast
du fragst 3 mal ob ein und der selbe Wert ungleich ist und setzt das mit ODER hintereinander ???? das muss immer wahr sein denn irgendwas ist hier immer ungleich

robi
 
robi schrieb:
texus schrieb:
IF [ $wert = "1" ] || [$wert = "2"] || [$wert = "3"]; then
probier mal
Code:
if [ $wert = "1" ] || [ $wert = "2" ] || [ $wert = "3" ]; then
ansonsten Klammern
Code:
if ( [ $wert = "1" ] || [ $wert = "2" ] ) || [ $wert = "3" ]; then
Es geht viel einfacher...
Code:
if [ "$wert" -eq 1 -o "$wert" -eq 2 -o "$wert" -eq 3 ]; then
    ...foobar...;
fi;
 

regexer

Advanced Hacker
robi schrieb:
du fragst 3 mal ob ein und der selbe Wert ungleich ist und setzt das mit ODER hintereinander ???? das muss immer wahr sein denn irgendwas ist hier immer ungleich
Genau! Nach den regeln der Boolschen Algebra ist der gesuchte term wohl eher:
Code:
if [ "$val" != "test1" ] && [ "$val" != "test2" ] && [ "$val" != "test3" ] 
then
 
OP
T

texus

Member
Ja sorry. :lol:
Manchmal sieht man den Wald vor lauter Bäumen nicht.
Ein logischer Fehler war das einzigste was ich mir auch noch denken konnte.

Vielen Dank allen Helfern.


MfG
texus
 

regexer

Advanced Hacker
jengelh schrieb:
Da leidet dann aber die CodingStyle-Qualität.
Meinst du das case-Konstrukt? Inwiefern? Das ist aus meiner Sicht Ansichtssache. Immerhin gibt es auch in anderem Umfeld switch-Verfechter...

Meine Erfahrung ist: Manchmal lässt sich ein case besser verstehen und leichter kommentieren.

Fiktives Beispiel:
Code:
case "$ersatzteiltyp" in 
  [A-Ca-c]) ...;; # Ersatzteile mit mindestens 10-jähriger Vorhaltedauer
  [Dd])     ...;; # Ersatzteile mit 5-jähriger Vorhaltedauer
  *)        ...;; #
esac
 
Oben