확인 날짜를 cal 명령에 입력하지 않고 이 스크립트 끝에서 내가 무엇을 잘못했는지 궁금합니다.

확인 날짜를 cal 명령에 입력하지 않고 이 스크립트 끝에서 내가 무엇을 잘못했는지 궁금합니다.
#Purpose: Validate a date
#Usage: chkdate year month day
#
if [ $# -eq 0 ]; then
        echo Usage: chkdate year month day
        exit 0
fi
year=$1; month=$2; day=$3; extra=$4
if [[ "$extra" != "" ]]; then
        # Too much data!
        echo Usage: chkdate year month day
        exit 1
fi
if [[ "$year" == "" || "$month" == "" || "$day" == "" ]]; then
        # Not enough data!
        echo Usage: chkdate year month day
        exit 2
fi
if [[ ! ( $year =~ ^[0-9]+$ && $month =~ ^[0-9]+$ && $day =~ ^[0-9]+$ ) ]]; then
        # Date not numeric!
        echo Usage: chkdate year month day
        exit 3
fi
#Remove leading zeros if any
year=$(echo "$year" | bc)
month=$(echo "$month" | bc)
day=$(echo "$day" | bc)
if [[ $year -lt 1 || $year -gt 9999 || $month -lt 1 || $month -gt 12 || $day -lt 1 || $day -gt 31 ]]; then
        # Date out of range!
        echo Usage: chkdate year month day
        exit 4
fi
if [[ ( $month == 1 || $month == 3 || $month == 5 || $month == 7 || $month == 8 || $month == 10 || $month == 12 ) && $day -gt 31 ]]; then
        # Invalid day!
        echo Usage: chkdate year month day
        exit 5
fi
if [[ ( $month == 4 || $month == 6 || $month == 9 || $month == 11 ) && $day -gt 30 ]]; then
        # Invalid day!
        echo Usage: chkdate year month day
        exit 6
fi
if [[ $month == 2 && $(($year%100)) == 0 ]]; then
        if [[ $(($year%400)) == 0 ]]; then
                isLeapYear=1
        else
                isNotLeapYear=1
        fi
elif [[ $month == 2 && $(($year%4)) == 0 ]]; then
        isLeapYear=1
else
        isNotLeapYear=1
fi
if [[ $month == 2 && $day -gt 28 && $isNotLeapYear ]]; then
        # Not Leap year!
        echo Usage: chkdate year month day
        exit 7
fi
if [[ $month == 2 && $day -gt 29 && $isLeapYear ]]; then
        # Invalid day!
        echo Usage: chkdate year month day
        exit 8
fi
while [[ $# -ne [1-8] ]]; do
cal << ( $year $month $day )
fi
echo $year $month $day is valid date

답변1

  • 당신이 사용하고 있는 것이 당신이 원하는 것일 [[가능성이 높 으므로 shebang을 추가하십시오.#!/bin/bash
  • [하나의 테스트 구문(단일 또는 이중 괄호 [[) 을 고수하십시오.
  • (여기 문서) 대신 <<당신이 원하는 것 <<<(여기 문자열)
  • 스크립트 루프가 while끝에서 닫히지 않고 done어딘가에 있을 것으로 예상됩니다.
  • 너무 많다 fi. (바꾸다 done???)
  • 어떻게든 루프를 종료하는 것이 좋을 것 같습니다...

관련 정보