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.
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.
Respostas:
Você pode usar printf
:
printf "hello\nworld\n"
printf
tem um comportamento mais consistente do que echo
. O comportamento de echo
varia muito entre versões diferentes.
printf %"s\n" hello world
- printf vai reutilizar o formato se muitos argumentos são dadas
echo
suporte for a -e
opção.
echo
, -e
é apenas impresso na própria saída, então eu acho que essa resposta é perfeitamente válida, pois echo
não é consistente aqui (a menos que estejamos falando de uma versão específica).
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
-e
param não existe em todos os sistemas operacionais * nix
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'
Você sempre pode fazer echo ""
.
por exemplo
echo "Hello"
echo ""
echo "World"
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.
echo -en "\n"
.
echo
é suficiente para obter uma linha vazia
Tentar
echo -e "hello\nworld"
hello
world
trabalhou para mim no nano
editor.
Na página do manual:
-e
ativar a interpretação de escapes de barra invertida
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;
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 echo
ambos como:
help echo
which echo
o que pode levar a alguma confusão.
Basta digitar
echo
para obter uma nova linha
str='hello\nworld'
$ echo | sed "i$str"
hello
world
Funciona para mim no CentOS:
echo -e ""hello\nworld""
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
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.
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:
Você também pode usar eco com aparelho,
$ (echo hello; echo world)
hello
world
echo hello; echo world
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)
Há uma nova expansão de parâmetro adicionada bash 4.4
que 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
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
À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"`
\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 \n
qualquer momento e é totalmente dependente do programa.
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]
Solução adicional:
Nos casos, você deve repetir várias linhas do conteúdo longo (como código / configurações)
Por exemplo :
echo -e
,
printf
pode 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.