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.