O problema está no comando echo $line
. Como não há cotações em torno de $line
, o shell executa a divisão de palavras nele e interpreta cada palavra como um padrão de globbing. Experimente com
a='*.txt foo'
ls $a
No seu caso, as guias separam as palavras, que se tornam argumentos separados para echo
. O comando echo
imprime seus argumentos separados por um espaço. Portanto, cut
acaba recebendo campos delimitados por espaço em vez de campos delimitados por tabulações.
Sempre coloque aspas duplas em torno das substituições de variáveis $foo
e substituições de comandos $(foo)
(a menos que você entenda por que precisa deixá-las de fora e por que não há problema em fazê-lo). echo "$line"
funcionaria aqui, mas é uma maneira complicada de fazer o que você propõe.
Mantendo sua abordagem de análise no shell, você pode fazer com que o comando read
analise a entrada nos campos.
while read DB USER PASS; do
echo "DB=$DB USER=$USER PASS=$PASS"
done <users.txt
read
divide os campos separados por caracteres no valor da variável IFS
, que consiste em um espaço e uma tabulação (além de uma nova linha, que não pode ocorrer dentro de uma linha) por padrão. Para dividir apenas nas guias, defina IFS
para uma única guia primeiro. Observe que as guias inicial e final são ignoradas e as guias consecutivas contam como uma única.
read
trata \
como um caractere especial: uma barra invertida seguida por uma nova linha é ignorada; \
se torna uma única barra invertida. Se você quiser evitar esse comportamento, passe a opção -r
.