Sprawdzanie daty wprowadzenia skryptu użytkownika


Odpowiedzi:


1

Ta metoda traktuje dane wejściowe jako łańcuch, a następnie analizuje i testuje je w celu prawidłowego formatowania. W tym formularzu sprawdzam również, czy pola w dacie są poprawne, ale możesz usunąć te warunkowe, jeśli ich nie potrzebujesz.

#!/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"

1

Możesz wybrać opcję akceptowania wielu formatów i konwertowania ich do standardowego formularza; date polecenie może pomóc:

$ 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

Mam problem z uruchomieniem tego w ogóle. Przeczytałem datę w zmiennej $ YMD i tam chcę kontynuować, jeśli data ma właściwy format, w przeciwnym razie chciałbym ponownie poprosić użytkownika o ponowne wprowadzenie daty we właściwym formacie.
— THE DOCTOR

Pokaż nam swój kod! Powyższy fragment robi coś pożytecznego, ale nie mogę (jeszcze) zobaczyć, dlaczego nie jest to dla Ciebie przydatne.
— Toby Speight
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.