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