if를 사용할 때 오류를 일으키는 특수 문자가 포함된 여러 문

if를 사용할 때 오류를 일으키는 특수 문자가 포함된 여러 문

특정 콘텐츠가 특정 파일/폴더에서 발견되지 않았는지 확인한 다음 "실패"를 인쇄하는 스크립트를 작성하려고 했습니다. 그렇지 않으면 "성공"을 인쇄해야 합니다. 그러나 다음 스크립트에서는 여러 오류가 발생합니다.

if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]
then
echo "Failed"
else
echo "Passed"
fi

누구든지 오류가 발생하는 이유와 오류를 제거하고 예상되는 출력을 얻을 수 있는 방법이 있는지 말해 줄 수 있습니까?

업데이트: 다음 오류가 발생합니다.

s.sh: line 1: conditional binary operator expected
s.sh: line 1: expected `)'
s.sh: line 1: syntax error near `'/example.com''
s.sh: line 1: `if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]'

답변1

[[...]]비교 및 기타 유형의 테스트를 수행하는 데 사용되는 구성입니다. ksh구문 분석이 특수 구문 규칙을 따르고 표준 명령을 대체하는 명령 입니다 [(일반적인 단순 명령 구문 분석 사용).

여기서는 아무것도 쓸모가 없습니다. 테스트하려는 것은 명령이 성공했는지 여부( grep또는 명령이 아님)이므로 다음과 같습니다.grep[[...]][

if grep -qF /example.com /opt/nfs || grep -RqF /example.com /data
then echo passed
else echo failed
fi

-q모든 일치 항목을 찾으려고 시도하는 대신 하나의 일치 항목이 발견되자마자 종료하여 출력을 억제하고 최적화합니다.

답변2

직접 방법:

grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data
if [ $? -eq 0 ]; then   # check exit status
    echo "Passed"
else 
    echo "Failed"
fi

  • grep이 옵션은 -q표준 출력에 아무 것도 쓰지 않도록 지시합니다. 0일치하는 항목이 발견되면 오류가 감지되더라도 상태 0으로 즉시 종료됩니다.

  • $?- 포함하다종료 상태최종적으로 명령을 실행하는 코드


위의 공식은 다음과 같이 단순화될 수도 있습니다.

if grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data; then
    echo "Passed"
else 
    echo "Failed"
fi

답변3

솔루션을 단순화할 수 있는 방법은 다음과 같습니다.

  • 첫째, GNU를 사용하면 grep인수 줄에 제공된 여러 파일|폴더에서 검색할 수 있습니다. 따라서 기본적으로 grep두 개의 서로 다른 폴더에서 동일한 패턴을 찾기 위해 두 개의 명령을 실행할 필요가 없습니다 . grep '/example.com' /opt/nfs /data해당 작업에 대한 검색이 나타납니다./example.com이 두 폴더에 .
  • 마지막 두 부정은 '예'와 같습니다. 그렇다면 단순히 이 코드를 사용하면 어떨까요? "/example.com"이 또는 if grep -rq "/example.com" /opt/nfs /data ; then echo "success" ; else echo "failed" ; fi grep에 나타나는 것을 찾으면 성공할 것입니다./opt/nfs/data

grep쉘에서 하나만 생성되므로 더 빠르고 효율적입니다 .

답변4

이 시도:

if [[ ! $(grep '/example.com' /opt/nfs &>/dev/null) || ! $(grep -R '/example.com' /data &>/dev/null) ]]
then
echo "Failed"
else
echo "Passed"
fi

stdout하지만 및 을 억제했기 때문에 스크립트가 의미가 없다고 생각합니다 . 명령의 출력은 항상 비어 있습니다. 억제만으로 대체되었습니다.stderr&>/dev/nullgrep&2stderr

관련 정보