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