'eco' sem nova linha em um script de shell

541

Estou com um problema echono meu script:

echo -n "Some string..."

impressões

-n Some string...

e passa para a próxima linha. No console, ele está funcionando corretamente, sem nova linha:

Some string...
qwertz
fonte
2
Qual implementação de shell bourne você está usando? Se eu rodar bashno modo bourne shell, ele funciona bem aqui. Além disso, é um pouco improvável que você esteja realmente usando um shell bourne como seu shell interativo, não?
FatalError
4
no Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii
Eu sei que isso é muito antigo, mas isso funciona para mim no Windows 10, para adicionar um período sem uma nova linha: eco | defina / p = "."
SPlatten

Respostas:

574

Existem várias versões do echocomando, com comportamentos diferentes. Aparentemente, o shell usado para o seu script usa uma versão que não reconhece -n.

O printfcomando tem um comportamento muito mais consistente. echoé bom para coisas simples como echo hello, mas sugiro usar printfpara algo mais complicado.

Em que sistema você está e qual shell seu script usa?

Keith Thompson
fonte
46
Começando com a linha #!/bin/bash, funcionou. Normalmente estou trabalhando com o bash.
qwertz
Eu gostaria que houvesse um equivalente do Windows no CMD :( Tanto quanto eu posso ver, não há, apenas soluções alternativas para atingir o mesmo comportamento.
kayleeFrye_onDeck
2
@kayleeFrye_onDeck: Talvez exista uma versão para Windows do printf comando.
Keith Thompson
Eu gostaria. echosempre adiciona novas linhas ... A solução alternativa é na melhor das hipóteses.
precisa saber é o seguinte
2
@alper O %é o seu prompt de shell. Tente isso e observe com cuidado:printf hello; sleep 5
Keith Thompson
150

bash possui um comando "interno" chamado "eco":

$ type echo
echo is a shell builtin

Além disso, existe um comando "echo" que é um executável adequado (ou seja, o shell bifurca e executa /bin/echo, em vez de interpretá echo-lo e executá-lo):

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

O comportamento de qualquer um echo WRT de um para \ce -nvaria. Sua melhor aposta é usar printf, que está disponível em quatro diferentes sabores * NIX que eu observei:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"
aqn
fonte
3
Obrigado pela resposta maciça em profundidade!
Darth Egregious
91

Tente com

echo -e "Some string...\c"

Funciona para mim como esperado (como entendi da sua pergunta).

Observe que eu recebi essas informações da manpágina. A manpágina também observa que o shell pode ter sua própria versão echoe não tenho certeza se bashtem sua própria versão.

Sonny
fonte
+1 por me indicar a direção certa, embora o eco que não reconhece a opção -ne provavelmente não reconheça a opção -e (nem precisa), então você provavelmente quer apenas dizer echo "some string...\c". Se, no entanto, você precisar oferecer suporte a várias variantes do bash com comandos echo muito diferentes, provavelmente é melhor usar printf ou precisar verificar os recursos dos comandos echo com algo como [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(pelo menos o bash suporta \ c também, portanto, não é necessário usar o -n opção, mas você precisa de -e para bash)
Timo
Para mim, isso faz exatamente o que -n faz no caso do OP: gera literal -e. Eu acho que printf é de fato mais consistente
aexl
-e não funcionará em um script shell posix, será enviado para a tela.
Thomas Dignan
7

Para conseguir isso, existem basicamente dois métodos que eu frequentemente uso:

1. Usando o caractere de escape do cursor ( \c) comecho -e

Exemplo :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eO sinalizador ativa os caracteres E scape na string.
  • \ctraz o C usor de volta à linha atual.

OU

2. Usando o printfcomando

Exemplo :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4
Gênio
fonte
3

Se você usar eco dentro de um if com outros comandos, como "ler", ele poderá ignorar a configuração e, de qualquer forma, irá pular para uma nova linha.

Alexandre Strube
fonte
2

Apenas para o Linux mais popular Ubuntu e é bash:

  1. Verifique qual shell você está usando? Principalmente abaixo funciona, mas veja isso :

    echo $0

  2. Se as impressões acima forem impressas bash, abaixo funcionará:

    printf "hello with no new line printed at end"
    OU
    echo -n "hello with no new line printed at end"

Manohar Reddy Poreddy
fonte
1

Eu acredito que agora a sua impressão de saída como abaixo

~ echo -e "String1\nString2"
String1
String2

Você pode usar xargspara obter o stdout de várias linhas na mesma linha.

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~
rɑːdʒɑ
fonte
0

Quando você escreve seu shell script, sempre coloque a primeira linha como #! / Usr / bin / env bash. Esse shell não omite ou manipula seqüências de escape. ex echo "Esta é a primeira \ n linha" imprime Esta é a primeira \ n linha.

Amit Singh
fonte
0
enable -n echo
echo -n "Some string..."
Riccardo La Marca
fonte