사용자 입력을 읽고 "cal" 명령을 사용하여 날짜를 검증하는 bash 스크립트

사용자 입력을 읽고 "cal" 명령을 사용하여 날짜를 검증하는 bash 스크립트

내 입력을 읽는 스크립트를 작성하고 싶습니다(예를 들어 스크립트 이름이 "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
  ...

질문이 맞기를 바라며 이것이 누군가에게 도움이 되기를 바랍니다. 물론 나를 위해 일했습니다 :)

관련 정보