A atribuição não remove os caracteres de nova linha, é realmente echo
fazer isso. Você precisa simplesmente colocar aspas ao redor da string para manter essas novas linhas:
echo "$testvar"
Isso dará o resultado que você deseja. Veja a seguinte transcrição para uma demonstração:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
A razão pela qual as novas linhas são substituídas por espaços não está inteiramente relacionada ao echo
comando, mas sim uma combinação de coisas.
Quando fornecida uma linha de comando, bash
divide-a em palavras de acordo com a documentação da IFS
variável:
IFS: o separador de campo interno que é usado para divisão de palavras após a expansão ... o valor padrão é <space><tab><newline>
.
Isso especifica que, por padrão, qualquer um desses três caracteres pode ser usado para dividir seu comando em palavras individuais. Depois disso, os separadores de palavras se foram, tudo o que resta é uma lista de palavras.
Combine isso com a echo
documentação (um bash
comando interno) e você verá por que os espaços são produzidos:
echo [-neE] [arg ...]: Produz os argumentos, separados por espaços, seguidos por uma nova linha.
Quando você usa echo "$x"
, força a x
variável inteira a ser uma única palavra de acordo com bash
, portanto, não é dividida. Você pode ver isso com:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
Aqui, a count
função simplesmente imprime o número de argumentos fornecidos. As variantes 1 2 3
e o a b c d
mostram em ação.
Em seguida, tentamos com as duas variações da x
variável. A única sem citações mostra que existem quatro palavras, "test"
, "1"
, "test"
e "2"
. Adicionar as aspas torna uma única palavra "test 1\ntest 2"
.
Isso se deve à variável IFS (Separador de campo interno) que contém nova linha.
Uma solução alternativa é redefinir o IFS para não conter a nova linha, temporariamente :
Para REVERTER esta mudança horrível para a IFS:
fonte
echo "$(IFS=''; cat text.txt)"
Bash -ge 4 tem o mapfile embutido para ler linhas da entrada padrão em uma variável de array.
Veja também:
http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile
fonte
Apenas se alguém estiver interessado em outra opção:
fonte
Sua variável está definida corretamente por
testvar=$(cat test.txt)
. Para exibir esta variável que consiste em caracteres de nova linha, basta adicionar aspas duplas, por exemploAqui está o exemplo completo:
fonte
O
envdir
utilitário fornece uma maneira fácil de fazer isso.envdir
usa arquivos para representar variáveis de ambiente, com mapeamento de nomes de arquivo para nomes env var e mapeamento de conteúdo de arquivo para valores env var. Se o conteúdo do arquivo contém novas linhas, o env var.Veja https://pypi.python.org/pypi/envdir
fonte