O problema é divisão de palavras . Para resolvê-lo, substitua:
PrintInfo $line
Com:
PrintInfo "$line"
Explicação
Considere:
PrintInfo $line
Antes de executar, PrintInfo
, o shell expandirá $line
e executará ambos divisão de palavras e expansão de nome de caminho .
Vamos dar um exemplo simples, começando por definir uma função:
$ PrintInfo() { echo "1= 2= 3="; }
Agora, vamos executar a função:
$ line="one two three"
$ PrintInfo $line
1=one 2=two 3=three
Acima, a divisão de palavras fez com que PrintInfo
visse três argumentos.
Se você quiser que PrintInfo
veja apenas um argumento, use:
$ PrintInfo "$line"
1=one two three 2= 3=
A expansão do nome do caminho também é um problema em potencial. Considere um diretório com esses arquivos:
$ ls
file1 file2 file3
Agora, vamos executar nossa versão de PrintInfo
novamente:
$ line='file?'
$ PrintInfo $line
1=file1 2=file2 3=file3
Como ?
é um caractere glob válido, o shell procura substituir file?
por nomes de arquivos. Para evitar essa surpresa, use aspas duplas:
$ PrintInfo "$line"
1=file? 2= 3=
Resumo
Exceto nos casos em que você deseja explicitamente divisão de palavras ou expansão de nome de caminho , variáveis de shell devem estar sempre entre aspas duplas .