Conteúdo do arquivo.txt (sem estranheza, arquivo de texto conforme definido pelo POSIX)
iguana
gecko
anole
Exemplo de roteiro:
#!/bin/sh
string="$(cat file.txt)"
printf '%s' "$string"
Exemplo de saída:
[coolguy@somemachine ~]$ ./script.sh
iguana
gecko
anole[coolguy@somemachine ~]$
O que aconteceu com a última nova linha? Por que todas as novas linhas, exceto a última, são preservadas? Parece que não deveríamos ter que usar echo para adicionar uma nova linha se já deveria haver uma lá.
Não é a impressão, é a substituição do comando que faz isso. Está definido para fazer isso. Da descrição POSIX :
Observe que ele remove todas as novas linhas à direita, não apenas uma.
Em um caso um tanto comum, você usaria a substituição de comando para capturar uma saída de uma linha, digamos
osrev=$(uname -r)
. Os utilitários geralmente imprimem uma nova linha à direita, para conveniência do usuário na linha de comando. Mas em um script de shell, você pode querer usar essa string como parte de outra, digamos um nome de arquivo:filename=blahblah-$osrev.dat
. E, nesse caso, a nova linha à direita seria apenas um incômodo.E, claro, uma planície
echo
adicionará uma nova linha final em qualquer caso.Se você deseja o conteúdo do arquivo como está na variável, a solução comum é adicionar um caractere extra na substituição do comando e removê-lo posteriormente:
que gera
$'foo\nbar\n\n'
, mostrando as duas novas linhas à direita presentes.Dependendo do que você pretende fazer com os dados, pode haver outras formas. Por exemplo, um
while read
loop ou Bash'smapfile
, se você quiser processar o arquivo linha por linha.