date nur werktage

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reox
Beiträge: 2541
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

date nur werktage

Beitrag von reox » 22.04.2009 13:28:23

Ich möchte gerne mit date die letzten werktage ausgeben, also eigentlich die letzten 7 werktage anzeigen, eben ohne samstag und sonntag. mein bisheriges skirpt:
for a in `seq 7`
do
echo "[$a] Datum: $(date +%d.%m.%Y -d "-$a days")"
done
kann ich mit der -d option date irgendwelche parameter angeben die nur werktage erlauben? weder im man noch im info hab ich was passendes gefunden... muss ich mir da quasi was selber bauen?

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: date nur werktage

Beitrag von Spasswolf » 22.04.2009 14:00:15

Ganz ohne basteln geht's wohl nicht:

Code: Alles auswählen

for a in `seq 7`
do
echo "[$a] Datum: $(date +%d.%m.%Y.%u -d "-$a days")" | grep -vE "\.6$|\.7$" | sed s/\.[1-5]$//g
done

reox
Beiträge: 2541
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: date nur werktage

Beitrag von reox » 22.04.2009 14:10:12

habs mitlerweile mal anderes versucht:

Code: Alles auswählen

offset=0
        for a in `seq 5`
        do
            if [ "$(date +%A -d "-$a days")" = "Sonntag" ]; then
                offset=2
            fi
            echo "[$(($a+$offset))] Datum: $(date +"%A %d.%m.%Y" -d "-$(($a+$offset)) days")"
        done
Mein Problem ist jetzt, dass ja der Counter am anfang auch das Offset bekommen muss, weil ich später dann das mache:

Code: Alles auswählen

        read -n 1 choose

        D1=$(date +%Y-%m-%d -d "-$choose days")
        D2=$(date +%Y_%m_%d -d "-$choose days")
Gäbe es da ne Möglichkeit, dass der Counter normal von 1-5 durchrennt und ich später wenn ich zB 3 wähle den richtigen Tag erwische? Also wenn oben

Code: Alles auswählen

[1] Datum: 21.04.2009
[2] Datum: 20.04.2009
[3] Datum: 17.04.2009
[4] Datum: 16.04.2009
[5] Datum: 15.04.2009
ausgegeben wird, ich 3 auswähle dann auch der 17.04.2009 verwendet wird?

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

Re: date nur werktage

Beitrag von rendegast » 22.04.2009 15:16:32

Vielleicht einfacher

Code: Alles auswählen

  %u     day of week (1..7); 1 is Monday
  %w   Tag der Woche (0..6); 0 steht für Sonntag
auf 1-5 testen, ala:

Code: Alles auswählen

$ date +%u -d -1days
2
reox hat geschrieben:wenn ich zB 3 wähle den richtigen Tag erwische?
select kann dann eine Liste erstellen, Ausschnitt aus meinem Skript zur nvidia-Treiberwahl:

Code: Alles auswählen

NAMES=$(	for i in $TREIBERLISTE ; do
	basename $i | sed 's@^NVIDIA-Linux-@@'
done
)
select NAME in $NAMES quit; do
    INSTALLER=$(echo $TREIBERLISTE | sed 's@ @\n@g' | grep  $NAME)
    break
done

$INSTALLER $SCHALTER $WHAT
NAMES wäre da die Liste der validen Tage, und INSTALLER das gewünschte Datum.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
bse
Beiträge: 468
Registriert: 19.03.2006 19:58:00
Lizenz eigener Beiträge: MIT Lizenz

Re: date nur werktage

Beitrag von bse » 22.04.2009 18:07:38

Nur so als Hinweis:

Es ist sinnvoll, wenn man die Ausgabe von date in einem if vergleichen will, beim Aufruf von date vorher LANG=C oder LC_TIME=C zu setzen, sonst funzt das ganze nicht mehr, sobald sich an den locales was ändert. Wenn man den DayOfWeek als Zahl verwendet, dann ist das natürlich überflüssig.

reox
Beiträge: 2541
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: date nur werktage

Beitrag von reox » 22.04.2009 18:40:38

ok danke für die guten tipps, so hab ich das auch erstmal umgesetzt:

Code: Alles auswählen

#!/bin/sh
case $1 in
    *)  
        offset=0
        DATES=$(for a in `seq 5`
        do
            if [ "$(date +%u -d "-$a days")" = "7" ]; then
                offset=2
            fi
            echo "$(date +%Y%m%d -d "-$(($a+$offset)) days")"
        done)
    
        echo "Choose your destiny..."
        select DATE in $DATES quit; do
            D1=$(date +%Y-%m-%d -d "$DATE")
            D2=$(date +%Y_%m_%d -d "$DATE")
            cvlc "http://ondemand.orf.at/news/playlist.php?id=zib2&day=$D1&fname=zib2200_$D2.wmv&offset=00:00:00"
            break;
        done

    ;;  
esac
geht auch super, nur kann man das datumsformat was ich jetzt ausgebe nicht besonders toll lesen... Gibt es da eine variante, wie ich die Ausgabe ändern kann ohne das $DATES array zu verändern oder kann man da bei date noch was drehen? Eine Funktion zum anzeigen der eingabe maske hab ich auch net gefunden...

edit: ok der totale workaround aber es geht:

Code: Alles auswählen

#!/bin/sh
timeoffset=0
[ "$(date +%H)" == "23" ] && timeoffset=-1 # wird gebraucht, da ja schon um 23 Uhr die neuste ZIB2 vorhanden ist

case $1 in
    *)  
        offset=0
        for a in `seq 5`
        do  
            [ "$(date +%u -d "-$(($a+$timeoffset)) days")" = "7" ] &&offset=2
            day=$(($a+$offset))
            day=$(($day+$timeoffset))
            DATES[$a]=$(date +"%A-%d.%m.%Y;%Y%m%d" -d "-$day days")
        done
    
        counter=1
        for date in ${DATES[@]}; do
            newdate=${date%;*}
            echo "[$counter]: ${newdate%-*} - ${newdate#*-}" 
            counter=$(($counter+1))
        done
        echo "Choose 1-5 or q for exit!"
        read -n 1 choose
            [ "$choose" = "q" ] && exit 0
        zibdate=${DATES[$choose]#*;}

        D1=$(date +%Y-%m-%d -d "$zibdate")
        D2=$(date +%Y_%m_%d -d "$zibdate")
        cvlc "http://ondemand.orf.at/news/playlist.php?id=zib2&day=$D1&fname=zib2200_$D2.wmv&offset=00:00:00"
    ;;  
esac
wer ne bessere idee hat: bitte bin für konstruktive kritik immer zu haben!
aber schonmal ein großes danke an alle! Wieder was gelernt :)

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: date nur werktage

Beitrag von ThorstenS » 24.04.2009 08:11:36

schönes Ding!

Woher kommt dein cvlc - hast du den vlc selbst übersetzt?
Ich benutzte ein amd64 lenny mit debian-multimedia Paketen, aber mein vlc kann deinen Stream nicht spielen, weil er die wma2 bzw wma3 Dateien nicht decoden kann. Würdest du mir bitte verraten mit welchen Paketen du arbeitest?
(mein 32bit etch kann damit umgehen)

reox
Beiträge: 2541
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: date nur werktage

Beitrag von reox » 24.04.2009 15:31:16

ich bin auf sid :D

Code: Alles auswählen

ii  vlc                                             0.9.9a-2                                        multimedia player and streamer
clvc ist bei vlc dabei afaik

Code: Alles auswählen

 % which cvlc
/usr/bin/cvlc
ist aber nur ein sh skript:

Code: Alles auswählen

#! /bin/sh
exec /usr/bin/vlc -I "dummy" "$@"

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: date nur werktage

Beitrag von ThorstenS » 24.04.2009 15:40:33

danke für die Info, dann baue ich mir mal nen backport.
ich hab gesehen, dass dmm.org für lenny gar keine Version bietet. Also habe ich noch die 0.8.x

reox
Beiträge: 2541
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: date nur werktage

Beitrag von reox » 24.04.2009 19:59:38

ja ich glaube lenny hat kein vlc, wegen nem bug oder so? vlc ist auf jeden fall seit längerem nicht in stable und testing so wie ich das noch mitbekommen hab :D

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: date nur werktage

Beitrag von ThorstenS » 24.04.2009 21:09:05

Nee, lenny hat schon Debianvlc aber eben noch eine uralte Version aus etch.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: date nur werktage

Beitrag von ThorstenS » 26.04.2009 17:52:47

So, nun funktioniert dein Script auch bei mir unter lenny mit vlc (Version 0.9.8a-3 aus testing).

Ich hab 28 Backportspakete gebaut ( fürs Archiv, meine Vorlage: http://forums.debian.net/viewtopic.php?t=37420 ) und habe nun endlich ein aktuelles vlc. :hail:
:mrgreen:

Antworten