입력 내용을 읽는 스크립트를 작성하고 싶습니다. 예를 들어 스크립트 이름이 "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)에서는 패키징이 cal
GNU 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
...
내 질문이 정확하고 이것이 누군가에게 도움이 되기를 바랍니다. 물론 그것은 나에게 효과적입니다 :)