제1장: The Missing Code Library -- 7. 합 법화 날짜 형식

3182 단어 linuxshellbash
모든 합 법화 입력 스 크 립 트 중 가장 도 전적인 것 은 작업 날짜 에 속 하지 않 으 면 안 됩 니 다.그것 의 목적 은 주어진 날짜 가 현실 에 존재 하도록 확보 하 는 것 이다.윤년 을 소홀히 한다 면, 이 임 무 는 결코 어렵 지 않다. 왜냐하면 매년 날짜 가 일치 하기 때문이다.이런 상황 에서 우리 가 해 야 할 일 은 주어진 날짜 와 매달 의 일 수 를 비교 하 는 것 뿐이다.하지만 윤년 을 계산 하기 위해 서 는 추가 논리 가 필요 하 다.     다음은 윤년 을 계산 하 는 규칙 집합 이다.
1. 4 로 정 제 될 수 없 는 것 은 윤년 이 아니다
2. 4 와 400 을 동시에 제거 할 수 있 는 것 은 윤년 이다.
3. 4 로 정 제 될 수 는 있 지만 400 으로 정 제 될 수 는 없 지만 100 으로 정 제 될 수 있 는 것 은 윤년 이 아니다.
4. 상기 상황 을 제외 하고 4 로 정 제 될 수 있 는 모든 것 은 윤년 이다.
코드:
validdate.sh
 #!/bin/sh
 
 # validdate.sh--       ,     
 
 exceedsDaysinMonth()
 {
     #       ,                 ,  0
     #   ,  1
 
     case $(echo $1 | tr '[:upper:]' '[:lower:]') in
         jan* ) days=31;;  feb* ) days=28;;
         mar* ) days=31;;  apr* ) days=30;; 
         may* ) days=31;;  jun* ) days=30;; 
         jul* ) days=31;;  aug* ) days=31;; 
         sep* ) days=30;;  oct* ) days=31;; 
         nov* ) days=30;;  dec* ) days=31;;
         *) echo "$0: Unknown month name $1" >&2; exit 1
     esac
 
     if [ $2 -lt 1 -o $2 -gt $days ]; then
         return 1
     else
         return 0    #       
     fi
 }
 
 isLeepYear()
 {
     #      ,    0;  ,  1
     #         :     4 
 
     year=$1
 
     if [ "$((year%4))" -ne 0 ]; then
         return 1 
     elif [ "$((year%400))" ]; then
         return 0
     elif [ "$((year%100))" ]; then
         return 1
     else
         return 0
     fi
 }
 
 #          
 
 if [ $# -ne 3 ]; then
     echo "  : $0      " >&2
     echo "        : August 3 1962 8 3 2002" >&2
     exit 1
 fi
 
 #      ,
 
 newdate="$(normdate.sh "$@")"
 
 if [ $? -eq 1 ]; then
     exit 1         # normdate       
 fi
 
 month="$(echo $newdate | cut -d\  -f1)"     #   ,-d\   -f1   2   ,   \        
   day="$(echo $newdate | cut -d\  -f2)"
  year="$(echo $newdate | cut -d\  -f3)"
 
 #           ,             
 
 if ! exceedsDaysinMonth $month "$2"; then
     if [ "$month" = "Feb" -a "$2" -eq "29" ]; then
         if ! isLeepYear $3; then
             echo "$0: $3       ,  2   29 ." >&2
             exit 1
         fi
     else
         echo "$0:      : $month    $2  ." >&2
         exit 1
     fi
 fi
 
 echo "    : $newdate"
 
 exit 0

스 크 립 트 실행: 스 크 립 트 를 실행 하려 면 명령 행 에서 '월 일 년' 이라는 형식 으로 날 짜 를 지정 해 야 합 니 다.달 은 세 자모의 줄 임 말, 온전한 달 또는 숫자 일 수 있다.하지만 해 는 네 자리 숫자 여야 한다.
실행 결과:
validdate.sh august 3 1960
     : Aug 3 1960
 validdate.sh 9 3 2001
     : Sep 3 2001
 validdate.sh feb 29 2004
     : Feb 29 2004
 ./validdate.sh feb 29 2006
 ./validdate.sh: 2006       ¸  2   29 .

스 크 립 트 분석:
이 스 크 립 트 의 사고방식 과 같이 우 리 는 합 법화 시간의 발걸음 을 쓸 수 있다.시간의 표시 형식 은 24 시간 제 를 사용 합 니 다.am/pm 접 두 사 를 사용 합 니 다.콜론 에서 시간 을 자 르 는 값 은 분 과 초 수 (주어진 것 이 있 으 면) 가 0 - 60 사이 에 있 는 지 확인 하고 am/pm 의 경우 첫 번 째 값 이 0 - 12 사이 에 있 는 지, 아니면 24 시간 제 가 0 - 24 사이 에 있 는 지 확인 합 니 다.(다행히도 시간 에는 윤초 와 다른 작은 변화 가 있어 달력 의 균형 을 유지 하기 때문에 일상적인 기초 위 에서 우 리 는 그것들 을 완전히 무시 할 수 있다)

좋은 웹페이지 즐겨찾기