'echo' senza newline in uno script di shell


541

Ho un problema con echonel mio script:

echo -n "Some string..."

stampe

-n Some string...

e passa alla riga successiva. Nella console funziona correttamente senza newline:

Some string...

2
Quale implementazione di bourne shell stai usando? Se corro bashin modalità bourne shell, qui funziona bene. Inoltre, è piuttosto improbabile che tu stia davvero usando una shell bourne come shell interattiva, no?
Errore fatale

4
su Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii,

So che è molto vecchio, ma funziona per me in Windows 10, per aggiungere un punto senza una nuova riga: echo | set / p = "."
SPlatten,

Risposte:


574

Esistono più versioni del echocomando, con comportamenti diversi. Apparentemente la shell utilizzata per lo script utilizza una versione che non riconosce -n.

Il printfcomando ha un comportamento molto più coerente. echova bene per cose semplici come echo hello, ma suggerisco di usarlo printfper qualcosa di più complicato.

Su quale sistema sei e quale shell usa il tuo script?


46
Iniziando con la linea #!/bin/bashha funzionato. Normalmente sto lavorando con bash.
qwertz,

Vorrei che ci fosse un equivalente di Windows in CMD :( Per quanto posso vedere, non c'è, solo soluzioni alternative per ottenere lo stesso comportamento.
kayleeFrye_onDeck

2
@kayleeFrye_onDeck: forse esiste una versione Windows del printfcomando.
Keith Thompson,

Spero che. echoaggiunge sempre nuove righe ... La soluzione è nella migliore delle ipotesi geniale.
kayleeFrye_onDeck,

2
@alper %È il prompt della shell. Prova questo e guarda attentamente:printf hello; sleep 5
Keith Thompson,

150

bash ha un comando "incorporato" chiamato "echo":

$ type echo
echo is a shell builtin

Inoltre, esiste un comando "echo" che è un eseguibile corretto (vale a dire, shell shell e exec /bin/echo, invece di interpretarlo echoed eseguirlo):

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

Il comportamento di echoWRT di entrambi \ce -nvaria. La tua scommessa migliore è usare printf, che è disponibile su quattro diversi * NIX gusti che ho visto:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

3
Grazie per la risposta estremamente approfondita!
Darth Egregious,

91

Prova con

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

Funziona per me come previsto (come ho capito dalla tua domanda).

Nota che ho ricevuto queste informazioni dalla manpagina. La manpagina nota anche che la shell potrebbe avere una sua versione di echo, e non sono sicuro che bashabbia una sua versione.


+1 per avermi suggerito la giusta direzione, anche se l'eco che non riconosce l'opzione -ne probabilmente non riconosce l'opzione -e (né ne ha bisogno), quindi probabilmente vorrai semplicemente dire echo "some string...\c"invece. Se tuttavia è necessario supportare più varianti bash con comandi echo molto diversi, probabilmente è meglio usare printf o è necessario verificare le funzionalità dei comandi echo con qualcosa del tipo [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(almeno bash supporta anche \ c, quindi non è necessario utilizzare il comando -n opzione, ma ti serve -e per bash)
Timo

Per me, questo fa esattamente quello che fa -n nel caso di OP: output letterale -e. Immagino che printf sia davvero più coerente
aexl

-e non funzionerà in uno script di shell posix, verrà invece emesso sullo schermo.
Thomas Dignan,

7

Per raggiungere questo obiettivo ci sono fondamentalmente due metodi che uso frequentemente:

1. Utilizzando il carattere di escape del cursore ( \c) conecho -e

Esempio :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eflag abilita i caratteri E scape nella stringa.
  • \cporta il C ursor fino alla linea di corrente.

O

2. Utilizzo del printfcomando

Esempio :

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

3

Se usi echo all'interno di un if con altri comandi, come "read", potrebbe ignorare l'impostazione e salterà comunque su una nuova riga.


2

Solo per Linux più popolare Ubuntu ed è bash:

  1. Controlla quale shell stai usando? Principalmente sotto funziona, altrimenti vedi questo :

    echo $0

  2. Se sopra stampa bash, quindi sotto funzionerà:

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


1

Credo che in questo momento la tua stampa di output come di seguito

~ echo -e "String1\nString2"
String1
String2

È possibile utilizzare xargsper ottenere stdout multilinea nella stessa riga.

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

 ~

0

Quando vai a scrivere il tuo script di shell metti sempre la prima riga come #! / Usr / bin / env bash. Questa shell non omette o manipola le sequenze di escape. ex echo "Questa è la prima riga \ n" stampa Questa è la prima riga \ n.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.