komplexe boolesche Berechnung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
sentolacco
Beiträge: 60
Registriert: 19.10.2006 21:26:39

komplexe boolesche Berechnung

Beitrag von sentolacco » 29.08.2008 22:48:03

Hi,

ich versuche gerade einen booleschen Ausdruck auszuwerten. Aber irgendwie krieg ich das nicht hin und mir gehen langsam die Ideen aus.

Das Script rechnet zuerst die aktuelle Minute des Tages aus. Der Wert wird in $minuteOfDay gespeichert. Der Teil funktioniert soweit.

Jetzt soll getestet werden, ob $minuteOfDay in zwei unabhängigen Berichen liegt.

Code: Alles auswählen

[ $([ $minuteOfDay -gt 1070 ]) and $([ $minuteOfDay -lt 1320 ]) ] || # 1070: 17:50, 1320: 22:00
[ $([ $minuteOfDay -gt  710 ]) and $([ $minuteOfDay -lt  780 ]) ]    #  710: 11:50,  780: 13:00
Lange Zeit habe ich nciht kapiert, dass && und || gleich stark binden. Aber auch mit dem oberen Konstrukt kommt das falsche Ergebnis raus.

Ich hoffe auf den Tritt in die richtige Richtung.

MfG
Thomas

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: komplexe boolesche Berechnung

Beitrag von GoKi » 29.08.2008 23:28:45

z.B. sowas sollte funktionieren:

Code: Alles auswählen

#!/bin/bash

#...

if (( ($minuteOfDay > 1070 && $minuteOfDay < 1320) || ($minuteOfDay > 710 && $minuteOfDay < 780) )); then
  echo "erfüllt"
fi
MfG GoKi
:wq

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: komplexe boolesche Berechnung

Beitrag von gms » 29.08.2008 23:49:49

da gibt es viele Lösungen, z.B

Code: Alles auswählen

gms2 ~ # bash x.sh
0700: false
0750: true
0800: false
1200: true
1400: false
gms2 ~ # cat x.sh
for minuteOfDay in 700 750 800 1200 1400; do
  if ( [ $minuteOfDay -gt 1070 ] && [ $minuteOfDay -lt 1320 ] ) \
       || \
     ( [ $minuteOfDay -gt  710 ] && [ $minuteOfDay -lt  780 ] ); then
    printf "%04d: true\n" $minuteOfDay
  else
    printf "%04d: false\n" $minuteOfDay
  fi
done

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

Re: komplexe boolesche Berechnung

Beitrag von Meillo » 30.08.2008 08:10:14

Tipp: Notfalls in einzelne Teilausdrücke aufsplitten und über mehrere IFs realisiseren.
Das ist logisch einfach zu verstehen und besser zu debuggen.
Wenn alles funktioniert, kann man daraus ja wieder einen großen Ausdruck erstellen.
Use ed once in a while!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: komplexe boolesche Berechnung

Beitrag von rendegast » 30.08.2008 13:20:24

Ich hätte einen Vorschlag:
Übersichtlicher, als die Minutenumrechnung.

/etc/cron.d/ZeitLock :

Code: Alles auswählen

50 11 * * * root  touch DeinLock
00 13 * * * root  rm DeinLock

50 17 * * * root  touch DeinLock
00 22 * * * root  rm DeinLock
DeinScript.sh :

Code: Alles auswählen

#!/bin/sh

[ -f DeinLock ] || exit 0

...
Zuletzt geändert von rendegast am 11.09.2008 15:32:17, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: komplexe boolesche Berechnung

Beitrag von rendegast » 30.08.2008 15:15:10

Mir gefällt dieses doppelte '-gt && -lt' nicht,
Noch eine Lösung für das Skript, Mathematik statt verschachtelter Tests:

Code: Alles auswählen

#!/bin/sh

minuteOfDay=$(( $(date +%k)*60 + $(date +%M) ))
minuteOfDay=$( date +%R | awk -F: '{print $1*60+$2}' )             # so geht es auch

rechne () {
  HALBE=$(( ($TIME2 - $TIME1) / 2 ))
  ZERO=$(( ($minuteOfDay - ($TIME1 + $HALBE)) / $HALBE ))
  COUNTER=$(( $COUNTER * $ZERO ))
}

COUNTER=1
TIME1=710;  TIME2=780
rechne
TIME1=1070;  TIME2=1320
rechne
[ $COUNTER -eq 0 ] || exit 0

...
Die Ergebnisse der Dividierung im Bereich (-1,1) rundet die bash-Arithmetik, und ZERO wird zu 0.
Ist hier der Fall für $minuteOfDay aus den Bereichen entweder [711,779] oder [1071,1319].
EIN Treffer nullt also das Termergebnis COUNTER, und das Skript könnte fortfahren.

Problematisch beim Überschreiten der 24h-Grenze, aber das Manko ist auch im OP.
-> nicht bei meiner ersten Lösung mit cron-gesetztem Lockfile.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Antworten