나는 숫자 시퀀스의 각 요소가 주어진 파일에 있는지 확인하고 그렇지 않은 요소를 인쇄하는 작은 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 -