스크립트를 실행할 때 로그 파일을 생성합니다.
동일한 로그 파일에 "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이 아닌 종료 상태로 종료된다는 일반 지침도 따릅니다.
변수 확장을 인용하지 않는 것과 관련이 있을 수도 있습니다.