Странное поведение grep -q в скрипте bash

Странное поведение grep -q в скрипте bash

Я пытаюсь написать небольшой 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 -

Связанный контент