Bash 스크립트에서 오류를 억제하는 방법

Bash 스크립트에서 오류를 억제하는 방법

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

관련 정보