Comportamiento extraño con grep -q en un script bash

Comportamiento extraño con grep -q en un script bash

Estoy intentando escribir un pequeño script bash que comprobará si cada elemento de una secuencia de números está en un archivo determinado e imprimirá los que no lo están.

find_missing.sh:

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

números.txt:

1
2
5

Rendimiento esperado:

3
4

Salida real:

1
2
3
4
5

Si cambio la línea grep -q "$num" numbers.txta grep "$num" numbers.txt, obtengo el resultado esperado. Sin embargo, tengo entendido que la -qbandera debería devolver un código de salida de 0 si se encuentra el número y un código de salida de 1 si no se encuentra, y no entiendo por qué tener o no la bandera hace la diferencia. .

Si intento ejecutar instancias individuales del comando grep, obtengo el comportamiento que espero:

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

¿Alguien puede ayudarme a entender qué está pasando aquí?

Respuesta1

$( ... )captura la salida, pero grep -qno produce ninguna salida. No lo uses. Ni siquiera necesitas los corchetes ya que ifpuedes usar el estado de salida:

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

Puede obtener el mismo resultado con

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

información relacionada