bash 스크립트는 "cal" 명령을 사용하여 사용자 입력을 읽고 날짜의 유효성을 검사합니다.

bash 스크립트는 "cal" 명령을 사용하여 사용자 입력을 읽고 날짜의 유효성을 검사합니다.

입력 내용을 읽는 스크립트를 작성하고 싶습니다. 예를 들어 스크립트 이름이 "check"인 경우 "check 9 4 1993"을 입력하면 입력 내용이 cal 명령과 달력 검사를 통해 유효한 날짜인지 확인됩니다. ).

내 생각에는 cal 명령을 통한 입력에서 오류가 발생하면 유효한 날짜가 아니며 그 반대의 경우에도 오류가 없으면 날짜가 유효하다는 것입니다. 나는 이 초안에 몇 가지 심각한 오류가 있다는 것을 알고 있습니다(내 입력이 cal 명령을 통과하도록 만드는 방법을 모르겠습니다). 그러나 몇 가지 조언을 주시면 감사하겠습니다. 어쨌든 초안은 다음과 같습니다.

#!/bin/bash

day=$1; month=$2; year=$3
day=$(echo "$day" | bc)
month=$(echo "$month" | bc)
year=$(echo "$year" | bc)

cal $day $ month $year 2> /dev/null
if [[$? -eq 0 ]]; then
   echo "This is a valid date"
else
   echo "This is an invalid date"
fi

답변1

내가 확인한 일부 Linux 배포판(예: Ubuntu 14.04)에서는 패키징이 calGNU Coreutils가 아닌 BSD에서 제공됩니다. BSD 버전은 날짜를 월과 연도로만 받아들이지 않는 것 같습니다. Ubuntu 버전에는 -H YYYY-MM-DD 옵션이 있지만 이는 도움이 되지 않는 것 같습니다.

대신 이 유틸리티를 사용하겠습니다 date. Linux에서 GNU Coreutils를 가정하면 다음과 같이 스크립트를 다시 작성할 것입니다.

#!/bin/bash

day=$((10#$1))
month=$((10#$2))
year=$((10#$3))

if date -d $year-$month-$day > /dev/null 2>&1; then
    # cal $month $year
    echo "This is a valid date"
else
    echo "This is an invalid date"
fi

노트:

  • 저는 쉘과 함께 제공되는 것을 사용하고 있습니다.산술 확장bc각 인수에 대해 새 프로세스를 만드는 대신 입력 유효성을 검사하고 선행 0을 제거합니다.
  • 나는 사용하고있다GNU 날짜입력 날짜 구문 분석
  • date 명령은 if조건식으로 직접 사용할 수 있습니다. if프로세스 종료 코드를 확인하여 작동합니다. [또는 [[실행 파일이 일반적으로 대신 사용 되지만 다른 프로그램이 유용한 종료 코드로 종료되는 경우 이를 사용할 이유가 없습니다.
  • cal정말로 정확한 날짜의 출력을 원하는지 잘 모르겠습니다 . 이렇게 하려면 해당 cal줄의 주석 처리를 제거하세요.

답변2

[[이는 실제로 명령이며 다른 명령과 마찬가지로 인수를 구분하려면 공백이 필요합니다.

if [[ $? -eq 0 ]]; then
# ...^

답변3

$달러와 변수 사이에 공백이 있습니다 month.

cal $day $ month $year 2> /dev/null

그것은해야한다:

cal $day $month $year 2> /dev/null

답변4

"%Y-%m-%d" 또는 "%m/%d/&Y" 형식으로 날짜를 입력하면(예: 2020-11-29 또는 11/29/2020) gnu를 사용하여 다음을 수행할 수 있습니다. 다음과 같이 날짜 유효 날짜(gdate)를 확인하십시오.

gdate -d "$1" +'%Y-%m-%d' > /dev/null 2>&1  # don't display any output
status=$(echo $?)                           # get error code
if [[ $status = 1 ]]                        # if date is invalid
then
  { echo "This date doesn't exist. Enter valid date!"; exit 1; }
else
  ...

내 질문이 정확하고 이것이 누군가에게 도움이 되기를 바랍니다. 물론 그것은 나에게 효과적입니다 :)

관련 정보