Eu suponho que as barras invertidas estão lá para escapar dos dois espaços para que eles não separem os valores.
Com read -r line
, você obtém toda a linha na variável line
, de modo que line
contenha user\ name user\ password
, com os backspaces. Não é fácil dividir isso sem truques com eval
. Um $line
sem aspas será dividido em espaços em branco, barras invertidas ou não. Citado, ele se expande em uma palavra, como você viu.
Felizmente, read
pode lidar com barras invertidas e dividir sua entrada em duas (ou mais) variáveis. Isso teria as variáveis contendo user name
e user password
(com as barras invertidas removidas):
while read user pass ; do
echo "user: $user"
echo "pass: $pass"
./connect.sh "$user" "$pass"
done < file
No entanto, se você quiser permitir espaços em branco no nome de usuário e na senha, talvez seja melhor usar algum outro delimitador do que o espaço. Dois pontos são comuns, então você teria uma entrada assim:
user name:user pass word
E depois leia com
while IFS=: read -r user pass ; do
echo "user: $user"
echo "pass: $pass"
done < file
(Isso deve funcionar desde que a senha não termine com dois pontos)