Wie führe ich eine Datumsüberprüfung für Benutzereingaben in einem Shell-Skript durch? Ich möchte den Benutzer benachrichtigen, wenn er das Datum im falschen Format eingibt. Das richtige Format wäre JJJJMMTT.
Antwort1
Diese Methode behandelt die Eingabe als Zeichenfolge, analysiert sie und prüft sie auf korrekte Formatierung. In diesem Formular lasse ich sie auch prüfen, ob die Felder im Datum korrekt sind, aber Sie können diese Bedingungen entfernen, wenn Sie sie nicht benötigen.
#!/bin/bash
echo -n "Enter the date as YYYYMMDD >"
read date
if [ ${#date} -eq 8 ]; then
year=${date:0:4}
month=${date:4:2}
day=${date:6:2}
month30="04 06 09 11"
leapyear=$((year%4)) # if leapyear this is 0
if [ "$year" -ge 1901 -a "$month" -le 12 -a "$day" -le 31 ]; then
if [ "$month" -eq 02 -a "$day" -gt 29 ] || [ "$leapyear" -ne 0 -a "$month" -eq 02 -a "$day" -gt 28 ]; then
echo "Too many days for February... try again"; exit
fi
if [[ "$month30" =~ "$month" ]] && [ "$day" -eq 31 ]; then
echo "Month $month cannot have 31 days... try again"; exit
fi
else echo "Date is out of range"; exit
fi
else echo "try again...expecting format as YYYYMMDD"; exit
fi
echo "SUCCESS!"
echo "year: $year month: $month day: $day"
Antwort2
Möglicherweise möchten Sie viele Formate akzeptieren und in eine Standardform konvertieren. Der folgende date
Befehl kann Ihnen dabei helfen:
$ day=$(unset day;
until date -d "${day:-XXX}" '+%Y%m%d' 2>/dev/null
do read -p "Which day? " day
done)
Which day?
Which day? weds
Which day? friday
$ echo $day
20150508