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.txt
a grep "$num" numbers.txt
, obtengo el resultado esperado. Sin embargo, tengo entendido que la -q
bandera 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 -q
no produce ninguna salida. No lo uses. Ni siquiera necesitas los corchetes ya que if
puedes 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 -