Unix 스크립트를 종료할 때 grep 명령 오류

Unix 스크립트를 종료할 때 grep 명령 오류

스크립트를 실행할 때 로그 파일을 생성합니다.

동일한 로그 파일에 "Msg...."가 포함된 메시지와 종료 코드("Msg 2714" 이외)가 있는지 확인하고 싶습니다.

그래서 스크립트에 다음 코드를 추가했습니다.

Some line of code before

rc1=`grep -v 'Msg 2714' $Logfilename`
rc2=`grep -i 'Msg' $rc1`

if [ $rc2 -ne "" ]
then
    echo "Error message, some query has failed"
    exit
fi

그러나 두 번째 grep이 null을 반환하더라도 종료 코드/반환 코드는 "1"이므로 "명령이 실패하고 스크립트가 존재하는 경우" grep 명령에 문제가 있습니다.

여기에 문제가 있는 경우 제안 사항이 있습니까?

감사합니다!

답변1

스크립트는 값을 $rc1파일 이름으로 사용하지만 이것이 출력입니다 grep.

첫 번째 출력을 grep다른 출력 으로 공급하려면 grep파이프를 사용하십시오.

grep -v ... filename | grep ...

결과를 in 변수 grep(대규모일 수 있음) 에 저장하는 대신 if이 파이프라인 실행 결과에 대해 테스트가 직접 작동하도록 하십시오.

if grep -v -F 'Msg 2714' "$Logfilename" | grep -q -F Msg; then
    echo 'Error message, some query has failed' >&2
    exit 1
fi

이는 파이프의 종료 상태(의 종료 상태가 됨 grep -q)를 사용하여 스크립트가 오류 메시지를 출력하고 종료해야 하는지 여부를 결정합니다. 변수에 데이터를 저장할 필요가 없습니다.

grep -q아무것도 출력되지 않지만, 주어진 패턴이 일치하면 성공적으로 종료됩니다. 또한 정규식이 아닌 문자열을 일치시키기 때문에 -F두 번의 호출을 사용했습니다 .grep

또한 표준 오류 스트림( echo ... >&2이 경우)에서 오류 메시지가 생성되고 치명적인 오류가 발생하면 스크립트가 0이 아닌 종료 상태로 종료된다는 일반 지침도 따릅니다.

변수 확장을 인용하지 않는 것과 관련이 있을 수도 있습니다.

관련 정보