NBash
71 строка · 1.5 Кб
1#!/bin/bash
2
3normdate="./L9-normdate"
4
5exceed_days_in_moth()
6{
7case $(echo $1 | tr '[:upper:]' '[:lower:]') in
8jan*) days=31 ;; feb*) days=28 ;;
9mar*) days=31 ;; apr*) days=30 ;;
10may*) days=31 ;; jun*) days=30 ;;
11jul*) days=31 ;; aug*) days=31 ;;
12sep*) days=30 ;; oct*) days=31 ;;
13nov*) days=30 ;; dec*) days=31 ;;
14*) echo "$0: Неизвестное название месяца $1" >&2
15exit 1
16esac
17
18if [ $2 -lt 1 -o $2 -gt $days ]; then
19return 1
20else
21return 0 # Число месяца допустимо
22fi
23}
24
25is_leap_year()
26{
27year=$1
28
29if [ "$((year % 4))" -ne 0 ]; then
30return 1
31elif [ "$((year % 400))" -eq 0 ]; then
32return 0
33elif [ "$((year % 100))" -eq 0 ]; then
34return 1
35else
36return 0
37fi
38}
39
40# Основной сценарий
41
42if [ $# -ne 3 ]; then
43echo "Использование: $0 месяц день год" >&2
44echo "Допустимые форматы October 12 1973 или 10 12 1973"
45exit 1
46fi
47
48newdate="$($normdate "$@")"
49if [ $? -eq 1 ]; then
50exit 1
51fi
52
53month="$(echo $newdate | cut -d\ -f1)"
54day="$(echo $newdate | cut -d\ -f2)"
55year="$(echo $newdate | cut -d\ -f3)"
56
57if ! exceed_days_in_moth $month "$2"; then
58if [ "$month" = "Feb" -a "$2" -eq "29" ]; then
59if ! is_leap_year $3; then
60echo "$0: $3 не високосный год, поэтому в Феврале не может быть 29 дней" >&2
61exit 1
62fi
63else
64echo "$0: неверное значение дня даты, в $month нет $2 дней" >&2
65exit 1
66fi
67fi
68
69echo "Дата корректна: $newdate"
70
71exit 0
72
73