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.