Primeiro, você definiu IFS
para \n
, não para uma nova linha. No bash, você pode usar $'…'
para ter seqüências de backslash interpretadas como caracteres de controle:
IFS=$'\n'
Ou você tem a opção portátil de usar uma nova linha literal.
IFS='
'
O segundo problema é que IFS
é importante quando você expande uma variável. Portanto, é necessário definir quando $i
é expandido, mas não importa quando você define i
.
i=$(grep -ril -e "$1" -- *)
set -f; OLDIFS="$IFS"; IFS='
'
for uneFiche in $i; do
set +f; IFS="$OLDIFS"
…
done
set +f; IFS="$OLDIFS"
Além disso, não se esqueça de citar variáveis quando não estiver dividindo, por exemplo, o padrão que você passa para grep
. Caso o padrão comece com -
, passe-o para grep
com a opção -e
. Coloque também --
na frente dos nomes dos arquivos, caso o primeiro nome de arquivo comece com -
. Além disso, caso um nome de arquivo contenha caracteres glob, desative a globbing com set -f
antes de deixar uma expansão variável sem aspas.
Uma abordagem mais simples seria chamar grep
em cada arquivo dentro do loop. Como benefício adicional, seu script não quebraria em nomes de arquivos contendo novas linhas.
for uneFiche in *; do
if grep -qri -e "$1" -- "$uneFiche"; then
…
fi
done