쉘 스크립트에서 사용자 입력에 대한 날짜 유효성 검사를 수행하려면 어떻게 해야 합니까? 사용자가 날짜를 잘못된 형식으로 입력한 경우 사용자에게 알리고 싶습니다. 올바른 형식은 YYYYMMDD입니다.
답변1
이 방법은 입력을 문자열로 처리한 다음 구문 분석하고 테스트하여 적절한 형식을 지정합니다. 이 양식에서는 날짜의 필드가 올바른지 확인하도록 했지만 필요하지 않은 경우 해당 조건을 제거할 수 있습니다.
#!/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"
답변2
다양한 형식을 허용하고 이를 표준 형식으로 변환하는 옵션이 마음에 들 수도 있습니다. 이 date
명령이 도움이 될 수 있습니다.
$ 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