date 명령으로 생성된 오류를 억제하려고 했지만 스크립트를 실행한 후에도 여전히 오류가 발생합니다.
#!/usr/bin/bash
input="30 FEB 2022"
reg="^[0-9]{1,2}\s[a-zA-Z]{1,3}\s[0-9]{1,4}$"
if [[ $input =~ $reg ]]
then
echo "VALID Date Format : $input"
#output=$(`date -d "$input" +"%d-%b-%Y, %A"` 2>&1 > /dev/null)
output=`date -d "$input" +"%d-%b-%Y, %A"` 2>&1 > /dev/null
else
echo "INVALID Date Format : $input"
output="-1"
fi
echo $output
실행 후 출력 -
root@ip-xx-x-xx-xxx:~# ./exDate.sh
VALID Date Format : 30 FEB 2022
date: invalid date '30 FEB 2022'
오류를 억제할 수 있는 방법을 알려주십시오.
답변1
더 나은 방법을 제공하는 답변이 이미 있으므로 귀하가 요청한 질문에만 답변하겠습니다. 오류 메시지가 계속 표시되는 이유는 리디렉션 순서가 중요하기 때문입니다. 리디렉션은 왼쪽에서 오른쪽으로 읽혀지므로 2>&1 > /dev/null
"먼저 stderr를 stdout으로 리디렉션한 다음"을 의미합니다.그 다음에stdout을 /dev/null
"로 리디렉션합니다. 이는 오류가 stdout으로 인쇄되고 일반 stdout이 로 리디렉션된다는 의미입니다 /dev/null
. stdout을 다음으로 파이핑하여 이를 확인할 수 있습니다 wc
.
## No redirection
$ date -d foo
date: invalid date ‘foo’
## Nothing is printed to stdout, the error goes to stderr
## and wc has nothing to count
$ date -d foo | wc
date: invalid date ‘foo’
0 0 0
## Redirect using 2>&1 > /dev/null
$ date -d foo 2>&1 > /dev/null
date: invalid date ‘foo’
## The error is now being printed to stdout, wc counts it
$ date -d foo 2>&1 > /dev/null | wc
1 4 29
당신이 원하는 것은 표준 출력을 /dev/null
첫 번째 출력 으로 리디렉션하고그 다음에stderr를 stdout으로 리디렉션: > /dev/null 2>&1
. 예상대로 작동합니다.
$ date -d foo > /dev/null 2>&1
$
답변2
정규식이나 패턴을 사용하여 날짜를 확인할 수 없습니다. (글쎄, 아마도 그렇게 할 수 있을 것 같지만, 그것은 불쾌할 것입니다.)
대신 date
명령 자체를 사용하여 입력의 유효성을 검사하십시오. 이 스크립트를 파일에 작성 exDate
하고 실행 가능하게 만듭니다( chmod a+x exDate
).
#!/bin/bash
input=$1
if date --date "$input" >/dev/null 2>&1
then
# Good date
output=$(date --date "$input" +'%d-%b-%Y, %A')
else
# Date parsing failed
printf 'INVALID Date Format : %s\n' "$input" >&2
output='-1'
fi
printf "%s\n" "$output"
예제 실행
./exDate '30 FEB 2022'
INVALID Date Format : 30 FEB 2022
-1
./exDate '24 FEB 2022'
24-Feb-2022, Thursday
./exDate '2022-04-13'
13-Apr-2022, Wednesday
마지막 옵션이 허용되지 않는 경우(즉, 양식의 날짜만 허용하려는 경우 d(d) MMM yyyy
) 다음을 사용하여 패턴 일치와 date
유효성 검사가 필요합니다.
if [[ "$input" =~ ^[0-9]{1,2}\ [a-zA-Z]{3}\ [0-9]{4}$ ]] && date…
then
if date...
할당 과 병합하여 코드를 단순화 output=
한 다음 실패 사례만 처리하면 됩니다 .
if ! output=$(date --date "$input" +'%d-%b-%Y, %A' 2>/dev/null)
then
# Date parsing failed
printf 'INVALID Date Format : %s\n' "$input" >&2
output='-1'
fi
답변3
기본 입력 날짜 형식은 미국입니다. 월은 날짜보다 앞에 있어야 합니다.
$ date -d '02/02/2022'
Wed 02 Feb 2022 12:00:00 AM UTC
$ date -d '02/22/2022'
Wed 22 Feb 2022 12:00:00 AM UTC
예, 월은 문자로 표시될 수 있습니다(로캘이 다른 국가에 있더라도 FEB 또는 2월).
$ date -d 'FEB 22 2022'
Tue 22 feb 2022 00:00:00 UTC
$ ( LC_ALL=es_ES.utf8 date -d 'FEB 22 2022')
mar 22 feb 2022 00:00:00 UTC
$ ( LC_ALL=ja_JP.utf8 date -d 'FEB 22 2022')
2022年 2月 22日 火曜日 00:00:00 UTC
단, 어떤 날짜에도 가능하지 않습니다.아니요날짜가 주어지면 오류를 보고해 보세요.존재하지 않는다. 2월 30일은 존재하지 않습니다. 이 경우 날짜가 출력되지 않습니다. 그리고 종료 상태를 1로 설정합니다. 실제로 정규 표현식 없이도 이를 사용하여 입력 날짜의 유효성을 검사할 수 있습니다.
#!/bin/bash
input="${1:-"30 FEB 2022"}"
if output=`date -d "$input" +"%d-%b-%Y, %A" 2>&1`
then echo "VALID Date : $input"
else echo "INVALID Date : $input"
output="-1"
fi
printf '%s\n' "$output"
물론 리디렉션이 다음 위치에 있어야 합니다.`...`
그들이 일하게 놔두세요.
$ ./exDate.sh
INVALID Date : 30 FEB 2022
-1
$ ./exDate.sh "22 FEB 2022"
INVALID Date : 22 FEB 2022
-1
$ ./exDate.sh "FEB 22 2022"
VALID Date : FEB 22 2022
22-Feb-2022, Tuesday
$ ./exDate.sh "FEB 30 2022"
INVALID Date : FEB 30 2022