Echo newline no Bash imprime literal \ n

No Bash, tentei isso:

echo -e "hello\nworld" 

Mas não imprime uma nova linha, apenas \n . Como posso imprimir a nova linha?

Estou usando o Ubuntu 11.04.

Você poderia usar printf vez disso:

 printf "hello\nworld\n" 

printf tem um comportamento mais consistente do que o echo . O comportamento do echo varia muito entre diferentes versões.

Tens a certeza que estás na festa? Funciona para mim, das três formas:

 echo -e "Hello\nworld" echo -e 'Hello\nworld' echo Hello$'\n'world 
 echo $'hello\nworld' 

impressões

 hello world 

$'' strings usam ANSI C Quoting :

Palavras do formulário $' string ' são tratadas especialmente. A palavra se expande para string , com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C.

Você sempre pode fazer echo "" .

por exemplo

 echo "Hello" echo "" echo "World" 

Na chance de que alguém se veja batendo a cabeça contra a parede tentando descobrir por que o roteiro de um colega de trabalho não imprime novas linhas, olhe para isso ->

 #!/bin/bash function GET_RECORDS() { echo -e "starting\n the process"; } echo $(GET_RECORDS); 

Como no acima exposto, o próprio funcionamento do método pode ser envolvido em um eco que substitui qualquer eco que possa estar no próprio método. Obviamente eu derramei isto para concisão, não era tão fácil de manchar!

Você pode então informar seus companheiros que uma maneira melhor de executar funções seria assim:

 #!/bin/bash function GET_RECORDS() { echo -e "starting\n the process"; } GET_RECORDS; 

Experimentar

 echo -e "hello\nworld" hello world 

trabalhou para mim no editor nano.

Isso funciona para mim em raspbian,

echo -e "hello\\nworld"

 str='hello\nworld' $ echo | sed "i$str" hello world 

POSIX 7 no eco

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e não está definido e as barras invertidas são definidas pela implementação:

Se o primeiro operando for -n, ou se algum dos operandos contiver um caractere , os resultados serão definidos pela implementação.

a menos que você tenha uma extensão XSI opcional.

Então use printf vez disso:

O operando de formato deve ser usado como a string de formato descrita em XBD File Format Notation […]

a notação de formato de arquivo :

\ n Mova a posição de impressão para o início da próxima linha.

Também tenha em mente que o Ubuntu 15.10 e a maioria das distribuições implementam o echo como:

  • um Bash embutido: help echo
  • um executável autônomo: which echo

o que pode levar a alguma confusão.

Mais uma input aqui para aqueles que não conseguiram trabalhar com qualquer uma dessas soluções e precisam obter um valor de retorno de sua function:

 function foo() { local v="Dimi"; local s=""; ..... s+="Some message here $v $1\n" ..... echo $s } r=$(foo "my message"); echo -e $r; 

Só que esse truque funcionou em um linux que eu estava trabalhando com esse bash:

 GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu) 

Espero que ajude alguém com problema semelhante.

Meu script:

 echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings 

Saída:

 WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file: 

No meu roteiro de bash eu estava ficando com raiva de você até que eu tentei:

 echo "WARNING : $warningsFound WARNINGS FOUND: $warningStrings" 

Basta apertar enter onde você deseja inserir esse salto. Saída agora é:

 WARNING : 2 WARNINGS FOUND: Warning, found the following local orphaned signature file: 

Isso poderia ser melhor feito

 x="\n" echo -ne $x 

A opção -e interpretará os backslahes para a seqüência de escape
-n opção irá remover a nova linha à direita na saída

PS: o comando echo tem o efeito de sempre include uma nova linha na saída, então -n é necessário para desativar essa coisa (e torná-la menos confusa)

Você também pode usar o eco com chaves,

 $ (echo hello; echo world) hello world 

Às vezes, você pode passar várias strings separadas por um espaço e elas serão interpretadas como \n .

Por exemplo, ao usar um script de shell para notifcações de várias linhas:

 #!/bin/bash notify-send 'notification success' 'another line' 'time now '`date +"%s"` 

Existe uma nova expansão de parâmetro incluída no bash 4.4 que interpreta sequências de escape:

${parameter@operator} - E operator

A expansão é uma string que é o valor do parâmetro com sequências de escape de barra invertida expandidas como no mecanismo de cotação $'…' .

 $ foo='hello\nworld' $ echo "${foo@E}" hello world 

funciona para mim em centos

 echo -e ""hello\nworld"" 

Você também pode fazer:

 echo "hello world" 

Isso funciona para mim no meu macOs.