Überprüfen Sie Datum-format in ein shell-Skript
Ich habe ein Shell-Skript, wobei einer der Parameter wird das Datum im format TT/mm/JJJJ. Meine Frage ist, wie kann ich überprüfen, ob das Datum als parameter übergeben wirklich folgt das Datum-Format? Ich habe den grep-Befehl wie folgt:
if echo "$1" | grep -q '^[0-3][0-9]/[0-1][0-9]/[0-9]\{4\}$'
aber es gab nicht das korrekte format, da der Tag zum Beispiel kann 33, 34, (...), das ist nicht wirklich das richtige format. Wer weiß etwas, das kann wirklich überprüfen, ob das übergebene Datum wirklich folgt dem format dd/mm/yyyy ?
- Siehe auch unix.stackexchange.com/a/236374/106927
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Datum
Wenn Sie nicht 0, dann Datum in format ungültig.
how can I check if the Date passed as parameter really follows this Date Format
. Dies nicht nichts überprüfen.date
akzeptiert Datumsangaben in verschiedenen Formaten. Zum Beispieltomorrow
ist ein gültiges format,date -d 'tomorrow + 5 months 20:00:01
ist genauso gültig.date -d '05/20/1900'
wirft einen Fehler für mich. Es hängt auch von Ihrer Architektur (der Zeitraum kann auch größer sein für 64-bit-Systeme). Dies ist definitiv nicht der Weg zu gehen. konsolebox Antwort statt.date
, aber diese Idee ist Scheiße, wie gut, weildate
auf 32-bit-Systeme nicht akzeptieren Datumsangaben über Jahr 2038.Die einfachste Lösung, die funktioniert immer noch perfekt, ist die folgende :
Es besteht in der Kombination von 2 Prüfungen :
$1
ist dieses format :NNNN-NN-NN
Benötigen Sie zwei Prüfungen, weil :
date
wird beendet mit code 0 auch wenn Ihre variable ein gültiges Datum in ein anderes format2016-13-45
Diese Funktion erwartet 2 Saiten,eine format-string -, Datums-Zeichenfolge
Format-string verwendet die codes vom date-Befehl, aber nicht der '+'
Die Funktion gibt 0 zurück, wenn das angegebene Datum mit dem angegebenen format, ansonsten gibt es 1
Prüfen Sie zunächst die form der Eingabe mit der regex. Dann verwenden awk zu wechseln, um mm/dd/yyyy, und verwenden Sie das Datum zu überprüfen. Können Sie verwenden Sie den folgenden Ausdruck in Ihrem
if
Aussage:Einfachste Weg für
dd/mm/yyyy
genau in der Bash ist:Oder
dd/mm/yyyy
. Also ich glaube, es wäre nicht wirklich egal jetzt.Wie über die Verwendung
awk
:Druckt es "gut", wenn sein gültiges Datum, sonst druckt "schlecht"
31/02/2012
oder29/02/2001
oder31/04/2000
oder...:(
echo "31/12/1999" | awk -F '/' '{ print ($1 <= 12 && $2 <= 31 && match($3, /^[1-9][1-9][1-9][1-9]$/)) ? "good" : "bad" }'
Die einzige Einschränkung ist, dass02/30/2014
bestehen würde, auch wenn das nicht ein Datum, aber dies ist immer noch perfekt für meine Bedürfnisse.Hier ist eine Funktion, um einige der Daten, die Validierung dieser:
99/87/0000
würde passieren grep.`X="2016-04-21", dann überprüfen Sie für die unten Wert 1 oder 0.
cal
echo $x | cut -c 6-7
echo $x | cut -c 1-4
2>/dev/null | grep -cecho $x | cut -c 9-10
Wenn der Wert 1 ist, dann ist es gültig ist, sonst ist es nicht gültig.
Schrieb ich dieses bash-Skript zum validieren Datum. Ich kann akzeptieren, mont als alphanumerisch.
Obwohl die Lösung (wenn [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date-d "$1" >/dev/null 2>&1) @ https://stackoverflow.com/users/2873507/vic-seedoubleyew ist das beste, zumindest für linux, aber es gibt Fehler, da können wir nicht direkt vergleichen/match regex in der if-Anweisung. Sollten wir den regulären Ausdruck in eine variable und dann sollten wir uns vergleichen/übereinstimmung, dass die variable in der if-Anweisung. Außerdem der zweite Teil der if-Bedingung nicht einen booleschen Wert zurück, so wird dieser Teil auch Fehler verursachen.
So, ich habe getan, eine geringfügige änderung in der obigen Formel und diese änderung kann auch angepasst werden, weiter für verschiedene andere Formate oder eine Kombination von Ihnen.
Blockquote