Zwei If Abfragen vereinen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
weshalb
Beiträge: 1265
Registriert: 16.05.2012 14:19:49

Zwei If Abfragen vereinen

Beitrag von weshalb » 11.02.2018 16:06:10

Hallo, ich möchte mein Spamassassinscript erweitern und würde dankend wissen, wie. Bisher ist es so, dass das Script abcheckt, ob Mails in einem bestimmten Ordner vorhanden sind und lernt dann erst an.

Bisher habe ich

Code: Alles auswählen

 #!/bin/bash
if [ -z "`ls /var/vmail/public/.Spamlern/cur/`" ] ; then
    exit
fi

sa-learn  --dbpath=/var/lib/spamassassin/.spamassassin/bayes    --spam  /var/vmail/public/.Spamlern/cur/
mv  /var/vmail/public/.Spamlern/cur/*   /var/vmail/public/learned/

Da Thunderbird manchmal aus unerklärlichen Gründen nochmal einen Unterordner benötigt, braucht das Script nun noch sowas:

Code: Alles auswählen

if [ -z "`ls /var/vmail/public/.Spamlern/.Spamlern/cur/`" ] ; then
    exit
fi

sa-learn  --dbpath=/var/lib/spamassassin/.spamassassin/bayes    --spam  /var/vmail/public/.Spamlern/.Spamlern/cur/
mv  /var/vmail/public/.Spamlern/.Spamlern/cur/*   /var/vmail/public/learned/

Wie kann ich quasi nacheinander die Ordner abfragen und dann auch nur die Anweisung laufen lassen, die benötigt wird.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Zwei If Abfragen vereinen

Beitrag von tobo » 11.02.2018 17:04:56

weshalb hat geschrieben: ↑ zum Beitrag ↑
11.02.2018 16:06:10
Wie kann ich quasi nacheinander die Ordner abfragen und dann auch nur die Anweisung laufen lassen, die benötigt wird.
Ich nehme mal an, dass dich in bestimmten Konstellationen das erste exit stört und die 2. Abfrage nicht mehr ausgeführt wird?! Dann könnte man einfach die Logik der Abfrage umdrehen:

Code: Alles auswählen

#!/bin/bash
if [ "$(ls -A /var/vmail/public/.Spamlern/cur/)" ]; then 
  sa-learn  --dbpath=/var/lib/spamassassin/.spamassassin/bayes    --spam  /var/vmail/public/.Spamlern/cur/
  mv  /var/vmail/public/.Spamlern/cur/*   /var/vmail/public/learned/
fi
if [ "$(ls -A /var/vmail/public/.Spamlern/.Spamlern/cur/)" ]; then
  sa-learn  --dbpath=/var/lib/spamassassin/.spamassassin/bayes    --spam  /var/vmail/public/.Spamlern/.Spamlern/cur/
  mv  /var/vmail/public/.Spamlern/.Spamlern/cur/*   /var/vmail/public/learned/
fi

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Zwei If Abfragen vereinen

Beitrag von breakthewall » 11.02.2018 19:06:05

tobo hat geschrieben: ↑ zum Beitrag ↑
11.02.2018 17:04:56

Code: Alles auswählen

#!/bin/bash
if [ "$(ls -A /var/vmail/public/.Spamlern/cur/)" ]; then 
  sa-learn  --dbpath=/var/lib/spamassassin/.spamassassin/bayes    --spam  /var/vmail/public/.Spamlern/cur/
  mv  /var/vmail/public/.Spamlern/cur/*   /var/vmail/public/learned/
fi
if [ "$(ls -A /var/vmail/public/.Spamlern/.Spamlern/cur/)" ]; then
  sa-learn  --dbpath=/var/lib/spamassassin/.spamassassin/bayes    --spam  /var/vmail/public/.Spamlern/.Spamlern/cur/
  mv  /var/vmail/public/.Spamlern/.Spamlern/cur/*   /var/vmail/public/learned/
fi
Ich würde die IF-Bedingung noch leicht verändern:

Code: Alles auswählen

if ls -A /var/vmail/public/.Spamlern/cur/ | grep -q "."
Denn letztlich geht es ja nur darum, zu reagieren wenn hier etwas existiert. Nur muss man dafür in der IF-Bedingung, nicht den ganzen Inhalt des Verzeichnisses auflisten, was je nach Menge einige Zeit dauern kann. Mit grep -q würde schon ein Ergebnis ausreichen.

owl102

Re: Zwei If Abfragen vereinen

Beitrag von owl102 » 11.02.2018 19:37:34

breakthewall hat geschrieben: ↑ zum Beitrag ↑
11.02.2018 19:06:05
Ich würde die IF-Bedingung noch leicht verändern:
Ich würde sie mehr als nur leicht verändern, denn: http://mywiki.wooledge.org/ParsingLs

Vermutlich ist eigentlich folgendes gemeint:

Code: Alles auswählen

if [[ -d /var/vmail/public/.Spamlern/cur/ ]] 

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Zwei If Abfragen vereinen

Beitrag von tobo » 11.02.2018 21:03:47

breakthewall hat geschrieben: ↑ zum Beitrag ↑
11.02.2018 19:06:05
Denn letztlich geht es ja nur darum, zu reagieren wenn hier etwas existiert. Nur muss man dafür in der IF-Bedingung, nicht den ganzen Inhalt des Verzeichnisses auflisten, was je nach Menge einige Zeit dauern kann. Mit grep -q würde schon ein Ergebnis ausreichen.
Wäre hier eine Ausgabe, dann hättest du recht. Allerdings, klar - es gibt noch 1000 andere Möglichkeiten das zu machen. Ich habe mich da einfach mehr oder weniger an dem orientiert, was da schon stand.
owl102 hat geschrieben: ↑ zum Beitrag ↑
11.02.2018 19:37:34
Ich würde sie mehr als nur leicht verändern, denn: http://mywiki.wooledge.org/ParsingLs
Wo wird denn was geparsed, so dass das dann relevant wäre?
Vermutlich ist eigentlich folgendes gemeint:

Code: Alles auswählen

if [[ -d /var/vmail/public/.Spamlern/cur/ ]] 
Nach der Logik sollte wohl eher der Inhalt des Verzeichnisses entscheidend sein!?

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Zwei If Abfragen vereinen

Beitrag von breakthewall » 11.02.2018 21:32:28

owl102 hat geschrieben: ↑ zum Beitrag ↑
11.02.2018 19:37:34
Ich würde sie mehr als nur leicht verändern, denn: http://mywiki.wooledge.org/ParsingLs
Hier wird der Output von ls ja nicht weiterverarbeitet.
ls in GNU coreutils >= 8.25 now correctly shell-escapes the filenames when printing to a terminal. Run cd "$(mktemp -d)"; touch "'" $'\n' "foo bar"; ls to see how it works. This is not done for pipes unless --quoting-style=shell-escape is given, but anyway you don't want to use a lot of eval.
Offenbar ist das teilweise entschärft worden. Und sonst nimmt man am besten find oder Shell-Globbing.

owl102

Re: Zwei If Abfragen vereinen

Beitrag von owl102 » 11.02.2018 22:03:35

tobo hat geschrieben: ↑ zum Beitrag ↑
11.02.2018 21:03:47
Wo wird denn was geparsed, so dass das dann relevant wäre?
"test -z" bzw. "test -n" ist auch Parsen der Ausgabe. Und http://mywiki.wooledge.org/BashFAQ/004 sacht explizit: "Never try to parse ls output. Even ls -A solutions can break"
Nach der Logik sollte wohl eher der Inhalt des Verzeichnisses entscheidend sein!?
Ja, da hatte ich wohl einen geistigen Aussetzer bzw. mal wieder zu schnell geschrieben, ohne ordentlich gelesen zu haben.

Zielführender: http://mywiki.wooledge.org/BashFAQ/004 ("How can I check whether a directory is empty or not?")

Benutzeravatar
weshalb
Beiträge: 1265
Registriert: 16.05.2012 14:19:49

Re: Zwei If Abfragen vereinen

Beitrag von weshalb » 11.02.2018 23:13:20

Ich danke erstmal für die Antworten und merke, dass ich vom Scripting weiter entfernt bin, als Mars vom Pluto.

Die Syntax erschließt sich für mich zwar überhaupt nicht, doch ich kann vermelden, dass das Beispiel von Tobo sehr gut funktioniert, wofür ich mich hier bedanken möchte.

Antworten