Nur bestimmtes Format für Eingabe

V

Vince95

Grünschnabel
Hallo zusammen,

Folgendes Problem:

Ein User soll ein Datum + Uhrzeit eingeben.
Das Format muss folgendermassen sein: yyyy-dd-mm-hh-mm-ss

Einlesen mit:

Code:
read -p "Bitte Snapshot eingeben (yyyy-dd-mm-hh-mm-ss) " snapshot

Wenn jetzt etwas anderes eingegeben wird, beispielsweise ein Buchstabe, soll eine Fehlermeldung ausgegeben werden.
Am besten wäre es, wenn die Zahlen natürlich auch noch eingegrenzt werden. Also Sekunden/Minuten/Stunden von 0 bis 60, Monat von 01 bis 12 und Tag von 0 bis 31.

Wäre nett, wenn mir jemand einen Tipp geben könnte, wie man sowas macht.

Gruss
Vince95
 
Eingabe mit cut aufteilen, einzelne Elemente mit if überprüfen.
 
Um nur zweistellige Daten zu erlauben:
Code:
if [[ "$DATE" =~ ^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])-([0-1][0-9]|2[0-3])-[0-5][0-9]-[0-5][0-9]$ ]]; then
...
Um auch einstellige Daten zu erlauben:
Code:
if [[ "$DATE" =~ ^[0-9]{1,4}-([0]{0,1}[1-9]|1[0-2])-([0]{0,1}[1-9]|[1-2][0-9]|3[0-1])-([0]{0,1}[0-9]|1[0-9]|2[0-3])-[0-5]{0,1}[0-9]-[0-5]{0,1}[0-9]$ ]]; then
...
Wobei ich annehme, dass Minuten und Sekunden von 0-59, Stunden von 0-23 und Tage von 1-31 gehen.

MfG

Schard
 
Zuletzt bearbeitet von einem Moderator:
oder die Eingabe date als entsprechend formatierten Timestamp vorwerden und schauen, ob die Ausgabe (mit einer entsprechende Formatangabe) der Eingabe entspricht.

Dann hätte man auch gleich eine Plausibilitätsprüfung drin, die mit einer reinen RegEx nur schwer zu erreichen ist...
 
oder die Eingabe date als entsprechend formatierten Timestamp vorwerden und schauen, ob die Ausgabe (mit einer entsprechende Formatangabe) der Eingabe entspricht.

Dann hätte man auch gleich eine Plausibilitätsprüfung drin, die mit einer reinen RegEx nur schwer zu erreichen ist...
Sehe ich auch so, trotz der schönen RegEx von Schard.

Also:
Code:
#!/bin/bash
read -p "Bitte Snapshot eingeben (yyyy-dd-mm-hh-mm-ss) " snapshot

IFS='-' d=($snapshot)
if date -d "${d[0]}-${d[2]}-${d[1]} ${d[3]}:${d[4]}:${d[5]}" 2>&1 >/dev/null
then
  echo "OK"
else
  echo "Nicht OK"
fi
 
Sehe ich auch so, trotz der schönen RegEx von Schard.

Also:
Code:
#!/bin/bash
read -p "Bitte Snapshot eingeben (yyyy-dd-mm-hh-mm-ss) " snapshot

IFS='-' d=($snapshot)
if date -d "${d[0]}-${d[2]}-${d[1]} ${d[3]}:${d[4]}:${d[5]}" 2>&1 >/dev/null
then
  echo "OK"
else
  echo "Nicht OK"
fi

Ach das Thema hier hab ich jetzt ganz vergessen.
Tut mir Leid :D

@Spröde:
Kannst du mir noch erklären, was in der Zeile genau passiert?

IFS='-' d=($snapshot)
if date -d "${d[0]}-${d[2]}-${d[1]} ${d[3]}:${d[4]}:${d[5]}" 2>&1 >/dev/null

PS: Das Format hat sich in der Zwischenzeit ein wenig geändert^^
Neu sollte es folgendermassen sein: yyyy-mm-dd-hh:mm:ss

Gruss
Vince
 
Es passiert das, was Marce vorgeschlagen hat: Die Eingabe wird in ein Array eingelesen und - entsprechend aufbereitet - an das Tool "date" weiter gegeben, dessen Exit-Code ausgewertet wird.

IFS='-' bestimmt den/die Feldtrenner für das Array (hier nur das Minuszeichen)

2>&1 >/dev/null leitet alle Ausgaben von date über die Wupper.
 
Und wenn ich jetzt 2 Feldtrenner habe?

Das neue Format beinhaltet noch Doppelpunkte..

Gruss
Vince
 

Ähnliche Themen

Shell script

PHP: Timestring convertieren

neues Datum durch Zeitangabe in sec berechnen

Wie berechnet linux/ein programm die uhrzeit?

[HowTo] TeamSpeak 2 - RC2 - Server (Deutsch/Englisch)

Zurück
Oben