
내 입력을 읽는 스크립트를 작성하고 싶습니다(예를 들어 스크립트 이름이 "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
...
질문이 맞기를 바라며 이것이 누군가에게 도움이 되기를 바랍니다. 물론 나를 위해 일했습니다 :)