Bash 스크립트에서 grep -q의 이상한 동작

Bash 스크립트에서 grep -q의 이상한 동작

나는 숫자 시퀀스의 각 요소가 주어진 파일에 있는지 확인하고 그렇지 않은 요소를 인쇄하는 작은 bash 스크립트를 작성하려고 합니다.

find_missing.sh:

#!/bin/bash
for num in {1..5}; do
    if ! [[ $(grep -q "$num" numbers.txt) ]]; then
        echo "$num"
    fi
done

숫자.txt:

1
2
5

예상 출력:

3
4

실제 출력:

1
2
3
4
5

grep -q "$num" numbers.txt줄을 로 변경하면 grep "$num" numbers.txt예상되는 출력을 얻습니다. 그러나 내 이해는 -q숫자가 발견되면 플래그가 종료 코드 0을 반환하고 숫자를 찾을 수 없으면 종료 코드 1을 반환해야 한다는 것입니다. 플래그가 있거나 없거나 차이가 나는 이유를 이해할 수 없습니다. .

grep 명령의 개별 인스턴스를 실행하려고 하면 예상한 동작이 나타납니다.

grep -q "1" numbers.txt; echo "$?"
0
grep -q "3" numbers.txt; echo "$?"
1

여기서 무슨 일이 일어나고 있는지 이해하도록 도와줄 수 있는 사람이 있나요?

답변1

$( ... )출력을 캡처하지만 grep -q출력을 생성하지 않습니다. 사용하지 마십시오. if종료 상태를 사용할 수 있으므로 대괄호도 필요하지 않습니다 .

if ! grep -q "$num" numbers.txt ; then

다음과 같은 결과를 얻을 수 있습니다.

printf '%s\n' {1..5} | grep -vwFf numbers.txt -

관련 정보