dpl.sh

Usecase

Jemand hat einen Dienstplan für einen bestimmen Monat und teilt dir die Schichten mit, damit du sie in deinen Kalender übernehmen kannst. Er/sie hat den Plan vor sich und ließt dir vor. Du willst die Informationen aus dem Dienstplan mit diesem Skript schnell aufnehmen und temporär in einer Textdatei festhalten, um sie dann entspannt in deinen Kalender eintragen zu können. Nachdem du mit diesem Skript die Schichten erfasst hast, kann dein Gegenüber „Pause“ machen.

Funktionsweise

Das Skript fragt nach Monat und Jahr und errechnet daraus, wie viele Tage der angegebene Monat hat. Damit wird verhindert, dass im Februar 30 Tage abgefragt werden. Für jeden Tag des gewählten Monats gibt man wahlweise die Schichtzeiten im Format hh-hh, also für das klassische from nine to five „09-17“. Nach der letzten Eintragung wird die Datei PLAN_$monat_$jahr.txt erstellt.

#!/bin/bash

# Benutzer nach Monat fragen
read -p "Geben Sie den Monat (01-12) ein: " MONAT
# Benutzer nach Jahr fragen
read -p "Geben Sie das Jahr ein (z.B. 2025): " JAHR

# Eingabedatei für die Schichten (dynamisch nach Monat und Jahr)
DATEI_SCHICHTEN="PLAN_${MONAT}_${JAHR}.txt"

# Überprüfen, ob die Schichten-Datei existiert, sonst erstellen
if [ ! -f "$DATEI_SCHICHTEN" ]; then
    touch "$DATEI_SCHICHTEN"
fi

# Anzahl der Tage im angegebenen Monat ermitteln
ANZAHL_TAGE=$(date -d "$JAHR-$MONAT-01 +1 month -1 day" +%d)

# Für jeden Tag des Monats die Schicht abfragen
for TAG in $(seq -f "%02g" 1 $ANZAHL_TAGE); do
    # Datum im Format dd.mm.jjjj
    DATUM="$TAG.$MONAT.$JAHR"
    
    # Schleife für wiederholte Eingabe im Fehlerfall
    while true; do
        # Abfrage für die Schichtzeit
        read -p "Schicht für den >>>  $DATUM  <<< (Format '06-13' für '06:00 bis 13:00', oder 'x' wenn frei): " SCHICHT
        
        if [ "$SCHICHT" == "x" ]; then
            # Wenn der Tag frei ist, dann 'frei' in die Datei schreiben
            echo "$DATUM | Frei" >> "$DATEI_SCHICHTEN"
            break
        elif [[ "$SCHICHT" =~ ^[0-9]{2}-[0-9]{2}$ ]]; then
            # Überprüfen, ob die Eingabe im richtigen Format ist und Uhrzeit hinzufügen
            START=$(echo $SCHICHT | cut -d'-' -f1)
            ENDE=$(echo $SCHICHT | cut -d'-' -f2)
            
            # Formatierte Schichtzeit
            FORMATIERT_START="${START}:00"
            FORMATIERT_ENDE="${ENDE}:00"
            
            # Ausgabe in die Datei
            echo "$DATUM | Schichtzeit: $FORMATIERT_START-$FORMATIERT_ENDE" >> "$DATEI_SCHICHTEN"
            break
        else
            # Fehlerausgabe in Rot für ungültige Eingabe
            echo -e "\033[1;31mUngültige Eingabe für $DATUM. Bitte im Format 'hh-hh', d.h. '08-15' für den Zeitraum von 08:00 bis 15:00 eingeben.\033[0m"
        fi
    done
done

echo "Die Schichten wurden in die Datei $DATEI_SCHICHTEN geschrieben."

Möchte man anstelle einer Textdatei gleich eine Datei, die man in seinen Kalender importieren und/oder teilen kann, dann braucht man dpl2ics.