(erledigt) bash: if or ... was mache ich falsch ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ren22

(erledigt) bash: if or ... was mache ich falsch ?

Beitrag von ren22 » 19.09.2019 17:04:22

Hallo,

ich bin eigentlich der Annahme das ich mit "or" bei einer if Abfrage entweder A=gleich oder B=gleich ist,
aber irgenwo habe ich wohl ein Denkfehler:

eine Datei names datei.txt mit folgendem Inhalt:
foobar1
foobar2
foobar3
foobar4
dazu mein Code:

Code: Alles auswählen

#!/bin/bash

while read line; do
    if [ ! "$line" == "foobar2" ] || [ ! "$line" == "foobar4" ]; then
        continue
    else
        echo "match: $line"
    fi
done < file.txt
eigentlich wollte ich, dass wenn entweder "foobar2" oder "foobar4" in der Variable "$line" enthalten ist, eine Ausgabe erscheint "echo "match: $line" aber leider erhalte ich garkeine Ausgabe. Was mache ich den Falsch ?

Danke
Zuletzt geändert von ren22 am 19.09.2019 18:08:20, insgesamt 1-mal geändert.

TomL

Re: bash: if or ... was mache ich falsch ?

Beitrag von TomL » 19.09.2019 17:16:50

1.

Code: Alles auswählen

    if [ ! "$line" == "foobar2" ] && [ ! "$line" == "foobar4" ]; then
        continue
    else
        echo "match: $line"
    fi
2.

Code: Alles auswählen

    if [ "$line" == "foobar2" ] || [ "$line" == "foobar4" ]; then
        echo "match: $line"
    else
        continue
    fi

ren22

Re: bash: if or ... was mache ich falsch ?

Beitrag von ren22 » 19.09.2019 17:40:46

Hallo TomL
danke für die Antwort, wobei ich jetzt nicht verstehe warum mein Code keine Ausgabe erzielt hat ...

*Ergänzung:
also laut der reinwerk openbook Dokumentation verstehe ich das nun so:

bei der Verwendung von "||" (or)
Eine ODER-Verknüpfung liefert bereits wahr zurück, wenn nur einer der Ausdrücke innerhalb der Verknüpfung wahr ist
Bild
http://openbook.rheinwerk-verlag.de/she ... /04_07.gif

bei der Verwendung von "&&" (and)
Bei einer UND-Verknüpfung müssen alle verwendeten Ausdrücke wahr sein, damit der komplette Ausdruck ebenfalls wahr (0) wird. Sobald ein Ausdruck einen Wert ungleich 0 zurückgibt, gilt der komplette Ausdruck als falsch
Bild
http://openbook.rheinwerk-verlag.de/she ... /04_06.gif

Danke

TomL

Re: bash: if or ... was mache ich falsch ?

Beitrag von TomL » 19.09.2019 18:13:40

ren22 hat geschrieben: ↑ zum Beitrag ↑
19.09.2019 17:40:46
wobei ich jetzt nicht verstehe warum mein Code keine Ausgabe erzielt hat ...

Code: Alles auswählen

if [ ! "$line" == "foobar2" ] || [ ! "$line" == "foobar4" ]; then
 Wenn nicht "foobar2" oder nicht "foobar4"	
        continue
Weil eine der zwei Bedingungen IMMER zutrifft... wenn "foobar2" enthalten ist, ist eben nicht "foobar4" enthalten, also "continue"... und genauso umgekehrt.
Bei einer UND-Verknüpfung müssen...
Deswegen habe ich das in 1. mit "not" bzw. "!" verknüpft:

Code: Alles auswählen

Wenn nicht "foobar2" und (auch) nicht "foobar4"
      continue

Huo
Beiträge: 778
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: (erledigt) bash: if or ... was mache ich falsch ?

Beitrag von Huo » 19.09.2019 18:40:08

Vielleicht noch eine kleine Ergänzung: Nach den De Morganschen Gesetzen der Aussagenlogik ist TomLs erste Lösung

Code: Alles auswählen

if [ ! "$line" == "foobar2" ] && [ ! "$line" == "foobar4" ]; then
auch äquivalent zu

Code: Alles auswählen

if ! { [ "$line" == "foobar2" ] || [ "$line" == "foobar4" ]; }; then
Es gilt nämlich:

Code: Alles auswählen

nicht (a oder b) = (nicht a) und (nicht b)

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: (erledigt) bash: if or ... was mache ich falsch ?

Beitrag von Meillo » 19.09.2019 20:23:36

Noch eine Anmerkungen fuer die Detailverliebten: Auch wenn `==' heutzutage funktioniert, so ist in der Shell bei test(1) eigentlich `=' fuer den Vergleich ``korrekter''.

Ich will es nur der Vollstaendigkeit halber erwaehnt haben.
Use ed once in a while!

Antworten