Benutzer-Werkzeuge

Webseiten-Werkzeuge


comp:ewkalbash
Übersetzungen dieser Seite?:

Bash: ewiger Kalender

Es musste ziemlich fix eine Bestimmung des Wochentags zu einem beliebigen Datum her. Also nimmt man die geeignetste Programmiersprache und tippt los… ;-)

Mir ist klar, dass das Script in keiner Weise elegant ist. Es fehlen auch sämtliche Eingabeüberprüfungen. Es ging mir eher um einen „Proof of Concept“. Naja, seht selbst:

/usr/local/bin/gibwotag
#!/bin/bash
 
# Quelle: https://de.wikipedia.org/wiki/Ewiger_Kalender Stand: 2014-07-25
 
usage() {
    echo "Aufruf: $0 <tag> <monat> <jahr>"
    echo "Rückgabe: Wochentag, abgekürzt (Mo, Di, Mi, Do, Fr, Sa, So)"
} # usage
 
getWochentag() {
    # Fehlerabfangversuch
    SOLLTAG=$1
    SOLLMON=$2
    SOLLJHR=$3
    FEHLER=0
    [ -z "$SOLLTAG" ] && FEHLER=1
    VERS=$(echo "$SOLLTAG" | tr -d '[0-9]')
    [ -z "$VERS" ] || FEHLER=1
    [ -z "$SOLLMON" ] && FEHLER=1
    VERS=$(echo $SOLLMON | tr -d '[0-9]')
    [ -z "$VERS" ] || FEHLER=1
    [ "x${#SOLLJHR}" != "x4" ] && FEHLER=1
    VERS=$(echo $SOLLJHR | tr -d '[0-9]')
    [ -z "$VERS" ] || FEHLER=1
    if [ $FEHLER -ne 0 ]; then
        usage
        exit 1
    fi
#    SOLLTAG=$(echo "$SOLLTAG" | tr -d '0') # Pech am 10., 20. und 30. eines Monats
#    SOLLMON=$(echo "$SOLLMON" | tr -d '0') # Pech im Oktober
    [ "y${SOLLTAG:0:1}" = "y0" ] && SOLLTAG="${SOLLTAG:1:1}"
    [ "y${SOLLMON:0:1}" = "y0" ] && SOLLMON="${SOLLMON:1:1}"
    # Jahre im Jahrhundert, relevant ist die Spalte
    J00=1 J06=1       J17=1 J23=1 J28=1 J34=1       J45=1 J51=1 J56=1 J62=1       J73=1 J79=1 J84=1 J90=1
    J01=2 J07=2 J12=2 J18=2       J29=2 J35=2 J40=2 J46=2       J57=2 J63=2 J68=2 J74=2       J85=2 J91=2 J96=2
    J02=3       J13=3 J19=3 J24=3 J30=3       J41=3 J47=3 J52=3 J58=3       J69=3 J75=3 J80=3 J86=3       J97=3
    J03=4 J08=4 J14=4       J25=4 J31=4 J36=4 J42=4       J53=4 J59=4 J64=4 J70=4       J81=4 J87=4 J92=4 J98=4
          J09=5 J15=5 J20=5 J26=5       J37=5 J43=5 J48=5 J54=5       J65=5 J71=5 J76=5 J82=5       J93=5 J99=5
    J04=6 J10=6       J21=6 J27=6 J32=6 J38=6       J49=6 J55=6 J60=6 J66=6       J77=6 J83=6 J88=6 J94=6
    J05=7 J11=7 J16=7 J22=7       J33=7 J39=7 J44=7 J50=7       J61=7 J67=7 J72=7 J78=7       J89=7 J95=7
    # Zahl der Jahrhunderte (jul./greg.)
    HJ03=1  HJ10=1  HJ17=1
    HJ04=2  HJ11=2  HJ18=2          HG15=2  HG19=2
    HJ05=3  HJ12=3  HJ19=3          HG16=3  HG20=3
    HJ06=4  HJ13=4  HJ20=4
    HJ00=5  HJ07=5  HJ14=5  HJ21=5  HG17=5  HG21=5
    HJ01=6  HJ08=6  HJ15=6  HJ22=6
    HJ02=7  HJ09=7  HJ16=6  HJ23=7  HG18=7  HG22=7
    # Monate
    M01=2    M02=5    M03=5    M04=1    M05=3    M06=6
    M07=1    M08=4    M09=7    M10=2    M11=5    M12=7
    # Sonntagsbuchstaben
    S11='F'  S12='E'  S13='D'  S14='C'  S15='B'  S16='A'  S17='G'
    S21='G'  S22='F'  S23='E'  S24='D'  S25='C'  S26='B'  S27='A'
    S31='A'  S32='G'  S33='F'  S34='E'  S35='D'  S36='C'  S37='B'
    S41='B'  S42='A'  S43='G'  S44='F'  S45='E'  S46='D'  S47='C'
    S51='C'  S52='B'  S53='A'  S54='G'  S55='F'  S56='E'  S57='D'
    S61='D'  S62='C'  S63='B'  S64='A'  S65='G'  S66='F'  S67='E'
    S71='E'  S72='D'  S73='C'  S74='B'  S75='H'  S67='G'  S77='F'
    # Monatstage
    MT01=1  MT08=1  MT15=1  MT22=1  MT29=1
    MT02=2  MT09=2  MT16=2  MT23=2  MT30=2
    MT03=3  MT10=3  MT17=3  MT24=3  MT31=3
    MT04=4  MT11=4  MT18=4  MT25=4
    MT05=5  MT12=5  MT19=5  MT26=5
    MT06=6  MT13=6  MT20=6  MT27=6
    MT07=7  MT14=7  MT21=7  MT28=7
    # Wochentage
    WT11='Mo'  WT12='Di'  WT13='Mi'  WT14='Do'  WT15='Fr'  WT16='Sa'  WT17='So'
    WT21='Di'  WT22='Mi'  WT23='Do'  WT24='Fr'  WT25='Sa'  WT26='So'  WT27='Mo'
    WT31='Mi'  WT32='Do'  WT33='Fr'  WT34='Sa'  WT35='So'  WT36='Mo'  WT37='Di'
    WT41='Do'  WT42='Fr'  WT43='Sa'  WT44='So'  WT45='Mo'  WT46='Di'  WT47='Mi'
    WT51='Fr'  WT52='Sa'  WT53='So'  WT54='Mo'  WT55='Di'  WT56='Mi'  WT57='Do'
    WT61='Sa'  WT62='So'  WT63='Mo'  WT64='Di'  WT65='Mi'  WT66='Do'  WT67='Fr'
    WT71='So'  WT72='Mo'  WT73='Di'  WT74='Mi'  WT75='Do'  WT76='Fr'  WT77='Sa'
    # Vorgehen:
    # -> man sucht die beiden letzten Stellen des Jahrs in der Jahrestabelle: Spalte merken
    # -> man sucht das Jahrhundert in der Jahrhunderttabelle: Zeile merken
    # -> an dieser Zeile und Spalte der Sonntagsbuchstabentabelle findet man den Sonntagsbuchstaben
    # -> man sucht die Monatstabelle den Monat und in der selben Zeile wieder den oben gefundenen Sonntagsbuchstaben: Spalte merken
    # -> in der Monatstagetabelle sucht man den Tag des Zieldatums: Zeile merken
    # -> im Schnittpunkt Monatstagszeile/2. Sonntagsspalte findet sich der Wochentag
 
    # Jahresspalte
    JHRSTR=${SOLLJHR:(-2)}
    printf -v JHRZHL "%02d" $JHRSTR
    JHRVAR="J${JHRZHL}"
    eval JAHRESSPALTE=\$$JHRVAR
    # Jahrhundertzeile
    JHUSTR=${SOLLJHR:0:2}
    if [ $JHUSTR -lt 15 ]; then
        JHHUVAR="HJ${JHUSTR}"
    else
        JHHUVAR="HG${JHUSTR}"
    fi
    eval JHHUZEILE=\$$JHHUVAR
    # Sonntagsbuchstabe
    SONNBUCHVAR="S${JHHUZEILE}${JAHRESSPALTE}"
    eval SONNBUCHST=\$$SONNBUCHVAR
    # Monatszeile
    printf -v MONSTR "%02d" $SOLLMON
    MONVAR="M$MONSTR"
    eval MONZEILE=\$$MONVAR
    SCHAJA=$(is_Leapyear $SOLLJHR)
    if [ $SCHAJA -eq 1 ]; then
        if [ "$MONSTR" = '01' -o "$MONSTR" = '02' ]; then
            let "MONZEILE -= 1"
        fi
    fi
    # Wochentagsspalte
    WTSPALTE=0
    TESTSP=1
    while [ $WTSPALTE -eq 0 ]; do
        TESTFLD="S${MONZEILE}${TESTSP}"
        eval TESTWRT=\$$TESTFLD
        [ "$TESTWRT" = "$SONNBUCHST" ] && WTSPALTE=$TESTSP
        let "TESTSP += 1"
    done
    # Tageszeile
    printf -v WUTAG "%02d" $SOLLTAG
    TAGVAR="MT${WUTAG}"
    eval TAGZEILE=\$$TAGVAR
    # Wochentag
    ZIELVAR="WT${TAGZEILE}${WTSPALTE}"
    eval ZIELWERT=\$$ZIELVAR
    echo "$ZIELWERT"
} # getWochentag
comp/ewkalbash.txt · Zuletzt geändert: 2014-08-12 1703 von werner