A nova linha de eco no Bash imprime literalmente \ n

2364

No Bash, tentei o seguinte:

echo -e "hello\nworld"

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

Estou usando o Ubuntu 11.04.

Sergey
fonte
264
Para aqueles que dizem "funciona para mim", o comportamento do eco varia bastante entre as versões. Alguns até imprimem o "-e" como parte de sua saída. Se você deseja um comportamento previsível para algo não trivial, use printf (como na resposta de @ sth).
Gordon Davisson 12/12
6
Não consegui obter nenhuma das sugestões desta resposta funcionando porque, como se vê, eu estava tentando usá-lo em uma função que retorna um valor , e todas as mensagens de eco (e printf) na função estavam sendo anexadas a o valor de retorno após a remoção individual de novas linhas . Aqui está uma pergunta sobre isso, com uma resposta extremamente completa: stackoverflow.com/questions/27872069/… Essa foi uma excursão misteriosa de três horas.
precisa saber é o seguinte
8
Também notável: em Unix e Linux Stack Exchange, a resposta aceita para Como adicionar novas linhas ao usar echo
Graham Perrin
@ GrahamPerrin, obrigado pelo link para uma resposta muito boa e detalhada! Eu acho que é melhor do que as respostas abaixo.
Konstantin
2
echo -ne "hello \ nworld" (você precisava do sinalizador n para interpretar escapes) - mas como outros dizem, diferentes comandos de eco podem ter resultados diferentes!
Konchog 28/03

Respostas:

2878

Você pode usar printf:

printf "hello\nworld\n"

printftem um comportamento mais consistente do que echo. O comportamento de echovaria muito entre versões diferentes.

sth
fonte
49
ou mesmo printf %"s\n" hello world- printf vai reutilizar o formato se muitos argumentos são dadas
glenn jackman
28
O OP perguntou sobre eco, não printf; e a resposta do @ choroba abaixo, que usa a opção -e, preenche a conta perfeitamente.
JESii 27/05
57
@ JESii: Serve se o seu echosuporte for a -eopção.
sth 27/05
11
Com algumas versões de echo, -eé apenas impresso na própria saída, então eu acho que essa resposta é perfeitamente válida, pois echonão é consistente aqui (a menos que estejamos falando de uma versão específica).
Tejas Manohar
14
Isso é bom se printf estiver disponível, mas, diferentemente do eco, às vezes o printf não está na distribuição.
precisa saber é o seguinte
1713

Tem certeza de que está no bash? Funciona para mim, de todas as quatro maneiras:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
choroba
fonte
368
flag -e fez isso por mim, que "permite interpretação dos escapes de barra invertida"
Tandy
21
Eu acho que o -eparam não existe em todos os sistemas operacionais * nix
kenorb
12
@kenorb: Existe no bash. É um builtin.
choroba 4/13
Por que o terceiro funciona? Sem o $ ele retorna "Hello n world"
Evan Donovan
21
Conforme mencionado por vários outros -e NÃO funciona em todas as distribuições e versões. Em alguns casos, é ignorado e, em outros, será realmente impresso. Eu não acredito que este fixa-lo para o OP, portanto, não deve ser aceito resposta
csga5000
578
echo $'hello\nworld'

impressões

hello
world

$''cordas usar ANSI C Citando :

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

Vanuan
fonte
15
@EvgeniSergeev Não sei o que você quer dizer, mas também não funcionou para mim. E isso é porque eu estava usando aspas duplas e isso funciona apenas com aspas simples! Tentei no Terminal no Mac.
trss 01/10/16
11
Problemas com variáveis ​​na cadeia não sendo expandidas.
Willemdh 3/11
Você ainda pode concatenar cadeias de aspas duplas. `foo =" bar "; echo $ '' $ foo'efoot ''
Kamafeather
141

Você sempre pode fazer echo "".

por exemplo

echo "Hello"
echo ""
echo "World"
Nayeem Zen
fonte
6
echo ""funciona para mim e acho que é a forma mais simples de imprimir uma nova linha, mesmo que isso não responda diretamente à pergunta. Felicidades.
Mario Awad
2
Eu acho que é menos óbvio (e, portanto, potencialmente mais confuso) do que echo -en "\n".
precisa saber é o seguinte
72
echoé suficiente para obter uma linha vazia
ROMANIA_engineer
5
@Okneloper Funciona muito bem para mim.
Matthew Leia
71

Tentar

echo -e "hello\nworld"
hello
world

trabalhou para mim no nanoeditor.

Na página do manual:

-e ativar a interpretação de escapes de barra invertida

Harsha Biyani
fonte
41

Se houver alguém batendo a cabeça contra a parede, tentando descobrir por que o roteiro de um colega de trabalho não imprime novas linhas, procure por isso ->

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

echo $(GET_RECORDS);

Como acima, a própria execução do método pode ser envolvida em um eco que substitui qualquer eco que possa estar no próprio método. Obviamente, eu aguentei isso por brevidade, não era tão fácil de detectar!

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

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

GET_RECORDS;
Tio Iroh
fonte
Certifique-se de envolver a variável entre aspas antes de ecoá-la do método.
ingyhere
23

Isso funciona para mim em Raspbian,

echo -e "hello\\nworld"
Sathesh
fonte
2
Funciona para mim em GitBash no Windows 7, também ;-)
Big Rico
3
A única barra invertida deve ser suficiente
Felix D.
23

POSIX 7 em eco

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

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

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

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

Portanto, recomendo que você use printf, o que é bem especificado:

O operando format deve ser usado como a string de formato descrita em Notação de formato de arquivo XBD.

a notação de formato de arquivo :

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

Lembre-se também de que o Ubuntu 15.10 e a maioria das distribuições implementam echoambos como:

  • um Bash embutido: help echo
  • um executável independente: which echo

o que pode levar a alguma confusão.

Ciro Santilli adicionou uma nova foto
fonte
17

Basta digitar

echo

para obter uma nova linha

R Sun
fonte
3
Resposta amplamente subestimada, não posso acreditar que esta pergunta tenha acumulado mais de 20 respostas desde 2011 e que nenhuma delas contém esta solução simples.
Prometheus
alias c = 'eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; eco; echo; ' Esta é a única maneira de limpar minha tela, obrigado!
Ahi Tuna
Tuna @Ahi: Por favor, use os atalhos de teclado do console, em vez :)
R Sun
@RSun e como eu faria isso em uma janela de terminal Debian em um Chromebook?
Ahi Tuna
1
@AhiTuna clear; ou ctrl + l;
Mike Seeds
16
str='hello\nworld'
$ echo | sed "i$str"
hello
world
alinsoar
fonte
Essa é realmente uma ótima resposta, pois funciona para concatenações de strings. Ótimo!
LavaScornedOven
1
Por que se preocupar em invocar um segundo programa? Não é que estamos tentando escrever um aplicativo em tempo real no bash;), mas não é necessário.
Felix D.
Esta é realmente uma ótima resposta que deve funcionar em qualquer lugar, não importa o quê. Você salvou meu amigo do dia @alinsoar
Kashyap Kotak
8

Funciona para mim no CentOS:

echo -e ""hello\nworld""
vanishedzhou
fonte
6

Você também pode fazer:

echo "hello
world"

Isso funciona tanto dentro de um script quanto na linha de comando.
Na linha de comando, pressione Shift+ Enterpara fazer as quebras de linha dentro da sequência.

Isso funciona para mim no meu macOS e no meu Ubuntu 18.04

vinzee
fonte
Como você digita essa quebra de linha sem ter o shell para executar o comando quando você pressiona 'enter'?
Xenos
@ Xenos Isso funciona bem em um script. E no console, basta clicar em Shift + Enter para adicionar uma nova linha para evitar que o shell execute o comando inacabado.
vinzee
5

Mais uma entrada aqui para aqueles que não o fizeram funcionar com nenhuma dessas soluções e precisam obter um valor de retorno de sua função:

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

r=$(foo "my message");
echo -e $r;

Somente esse truque funcionou em um linux no qual eu estava trabalhando com este bash:

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

Espero que ajude alguém com problema semelhante.

DNT
fonte
4

Meu script:

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

Resultado:

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

No meu script bash, eu estava ficando louco como você, até que tentei:

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

Basta pressionar enter onde deseja inserir esse salto. A saída agora é:

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
TanisDLJ
fonte
4
Apenas uma observação, você provavelmente desejará usar $ {} em torno de seus nomes de variáveis, pois isso não pode levar a comportamentos realmente estranhos quando um shell encontra uma variável chamada $ warningsFound e imprime essas e não as duas saídas separadas.
dragon788
@ dragon788 talvez esteja faltando alguma coisa, mas a variável é realmente chamada $ warningsFound?
psynnott
2
Eu perdi uma palavra nisso. Se você tivesse uma variável chamada $ warnings, em alguns casos sem usar $ {warningsFound}, poderia acabar com o conteúdo de $ warnings + "Found" em vez da variável que você pretendia.
dragon788
3

Você também pode usar eco com aparelho,

$ (echo hello; echo world)
hello
world
Avinash Raj
fonte
erro de sintaxe próximo ao token inesperado `('quando chamado no arquivo .sh
cosbor11
1
tenteecho hello; echo world
Avinash Raj
1
Ou "eco olá && eco mundo" ou apenas: "eco olá eco mundo"
csga5000 15/16
3

Isso poderia ser melhor feito como

x="\n"
echo -ne $x

A opção -e interpretará barras invertidas para a sequência de escape
-n opção removerá a nova linha à direita na saída

PS: o comando eco tem o efeito de sempre incluir uma nova linha à direita na saída, portanto -n é necessário para desativar essa coisa (e torná-la menos confusa)

Dhwanit
fonte
echo -ne "Olá \ Nworld" para a resposta exata da questão :)
Dhwanit
3

Há uma nova expansão de parâmetro adicionada bash 4.4que interpreta seqüências de escape:

${parameter@operator} - E operator

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

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

Se você estiver escrevendo scripts e ecoando novas linhas como parte de outras mensagens várias vezes, uma boa solução de plataforma cruzada é colocar uma nova linha literal em uma variável como esta:

newline='
'

echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
skiggety
fonte
0

À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 notificações de várias linhas:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
Hunter Frazier
fonte
Isto está incorreto. Nunca é interpretado como \n. Ele é interpretado como um argumento separado para o programa, e o próprio programa pode exibir esse argumento em uma nova linha, mas isso não significa que foi convertido para \nqualquer momento e é totalmente dependente do programa.
Score_Under
0

Eu tive que colocar o texto entre aspas duplas enquanto usava como alias no perfil do bash (MacOx, iTerm).

alias helloworld="echo -e \"hello \n world\""
John Jai
fonte
0

Isso me levou até lá ....

outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff

Rendimentos:

RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]
Joe Healy
fonte
-1

Eu apenas uso eco sem argumentos

echo "Hello"
echo
echo "World"
Xenon
fonte
-2

Solução adicional:

Nos casos, você deve repetir várias linhas do conteúdo longo (como código / configurações)

Por exemplo :

  • Um script Bash para gerar códigos / configurações

echo -e, printfpode ter alguma limitação

Você pode usar um caractere especial como um espaço reservado como uma quebra de linha (como ~) e substituí-lo depois que o arquivo foi criado usandotr

echo ${content} | tr '~' '\n' > $targetFile

ele precisa chamar outro programa ( tr) que deve estar bem na IMO.

ZenithS
fonte