Seu problema é coberto Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais? . Vou apenas explicar brevemente o que está acontecendo aqui.
O culpado é for r in ${documents[@]} . Como a expansão da variável é deixada sem aspas, você está usando a operação “split + glob”: o valor de cada elemento da matriz é dividido em palavras de acordo com o valor de IFS e cada palavra é tratada como um padrão curinga. Como você só definiu IFS para a duração do read (consulte Por que é 'enquanto IFS = lê' usado com tanta freqüência, ao invés de 'IFS =; enquanto lê ..'? ), o valor de IFS neste momento é o padrão, que inclui espaços. Além disso, se você tivesse um campo contendo algo como foo * , veria os nomes dos arquivos no diretório atual. A solução é for r in "${documents[@]}" , que é a maneira padrão de iterar em uma matriz: as aspas duplas transformam isso em uma desreferência de variável reta sem divisão e globbing, e a [@] faz com que cada elemento da matriz seja colocado em uma palavra separada .
Enquanto a configuração de IFS=$'\t' para todo o script parece resolver o problema, na verdade só resolve metade do problema: ele não impede que ocorra globbing com ${documents[@]} . Embora você possa desativar o globbing com set -f , é mais claro usar aspas duplas.