In Bash, ho provato questo:
echo -e "hello\nworld"
Ma non stampa solo una riga \n
. Come posso farlo stampare la nuova riga?
Sto usando Ubuntu 11.04.
In Bash, ho provato questo:
echo -e "hello\nworld"
Ma non stampa solo una riga \n
. Come posso farlo stampare la nuova riga?
Sto usando Ubuntu 11.04.
Risposte:
È possibile utilizzare printf
invece:
printf "hello\nworld\n"
printf
ha un comportamento più coerente di echo
. Il comportamento di echo
varia notevolmente tra le diverse versioni.
printf %"s\n" hello world
- printf riutilizzerà il formato se vengono forniti troppi argomenti
echo
capita di supportare l' -e
opzione.
echo
, -e
è appena stampato nell'output stesso, quindi penso che questa risposta sia perfettamente valida poiché echo
non è coerente qui (a meno che non stiamo parlando di una versione specifica).
Sei sicuro di essere a Bash? Funziona per me, in tutti e quattro i modi:
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
-e
param non esista su tutti i sistemi operativi * nix
echo $'hello\nworld'
stampe
hello
world
$''
le stringhe utilizzano ANSI C Citando :
Le parole del modulo sono trattate in modo speciale. La parola si espande in stringa , con i caratteri con escape backslash sostituiti come specificato dallo standard ANSI C.
$'string'
Puoi sempre fare echo ""
.
per esempio
echo "Hello"
echo ""
echo "World"
echo ""
funziona per me e penso che sia il modo più semplice per stampare una nuova riga, anche se questo non risponde direttamente alla domanda. Saluti.
echo -en "\n"
.
echo
è sufficiente per ottenere una riga vuota
Provare
echo -e "hello\nworld"
hello
world
ha lavorato per me nano
nell'editore.
Dalla pagina man:
-e
abilitare l'interpretazione di escape backslash
Nella remota possibilità che qualcuno si trovi a sbattere la testa contro il muro cercando di capire perché la sceneggiatura di un collega non stampa nuove righe, cerca questo ->
#!/bin/bash
function GET_RECORDS()
{
echo -e "starting\n the process";
}
echo $(GET_RECORDS);
Come in precedenza, l'esecuzione effettiva del metodo può essere racchiusa in un'eco che sostituisce qualsiasi eco che può essere presente nel metodo stesso. Ovviamente l'ho annacquato per brevità, non è stato così facile individuarlo!
Puoi quindi informare i tuoi compagni che un modo migliore per eseguire le funzioni sarebbe così:
#!/bin/bash
function GET_RECORDS()
{
echo -e "starting\n the process";
}
GET_RECORDS;
POSIX 7 su eco
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
non è definito e le barre rovesciate sono definite dall'implementazione:
Se il primo operando è -n o se uno degli operandi contiene un carattere <barra rovesciata, i risultati sono definiti dall'implementazione.
a meno che tu non abbia un'estensione XSI opzionale.
Quindi ti consiglio di usare printf
invece, che è ben specificato:
l'operando di formato deve essere usato come stringa di formato descritta nella notazione del formato di file XBD [...]
la notazione sul formato del file :
\ n <newline> Sposta la posizione di stampa all'inizio della riga successiva.
Inoltre, tieni presente che Ubuntu 15.10 e la maggior parte delle distribuzioni implementano echo
entrambi come:
help echo
which echo
che può creare confusione.
Digita semplicemente
echo
per ottenere una nuova linea
str='hello\nworld'
$ echo | sed "i$str"
hello
world
Funziona per me in CentOS:
echo -e ""hello\nworld""
Puoi anche fare:
echo "hello
world"
Funziona sia all'interno di uno script che dalla riga di comando.
Nella riga di comando, premi Shift+ Enterper eseguire le interruzioni di riga all'interno della stringa.
Questo funziona per me sul mio macOS e sul mio Ubuntu 18.04
Un'altra voce qui per coloro che non l'hanno fatto funzionare con nessuna di queste soluzioni e hanno bisogno di ottenere un valore di ritorno dalla loro funzione:
function foo()
{
local v="Dimi";
local s="";
.....
s+="Some message here $v $1\n"
.....
echo $s
}
r=$(foo "my message");
echo -e $r;
Solo questo trucco ha funzionato in un Linux su cui stavo lavorando con questo bash:
GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)
Spero che aiuti qualcuno con un problema simile.
La mia sceneggiatura:
echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings
Produzione:
WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:
Sul mio script bash mi stavo arrabbiando come te fino a quando non ho appena provato:
echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"
Basta premere invio nel punto in cui si desidera inserire quel salto. L'output ora è:
WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
Puoi anche usare l'eco con le parentesi graffe,
$ (echo hello; echo world)
hello
world
echo hello; echo world
Questo potrebbe essere fatto meglio come
x="\n"
echo -ne $x
-e l'opzione interpreterà i backslahes per la sequenza di escape
-n l'opzione rimuoverà la nuova riga finale nell'output
PS: il comando echo ha l'effetto di includere sempre una nuova riga finale nell'output, quindi è necessario -n per spegnere quella cosa (e renderla meno confusa)
È stato aggiunto un nuovo parametro di espansionebash 4.4
che interpreta le sequenze di escape:
${parameter@operator} - E operator
L'espansione è una stringa che è il valore del parametro con sequenze di escape barra rovesciata espanse come con il
$'…'
meccanismo di quotazione.
$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
Se stai scrivendo script e ripeterai ripetutamente le nuove righe come parte di altri messaggi, una buona soluzione multipiattaforma consiste nel mettere una nuova riga letterale in una variabile in questo modo:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
A volte puoi passare più stringhe separate da uno spazio e verrà interpretato come \n
.
Ad esempio quando si utilizza uno script shell per le notifiche multilinea:
#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
\n
. Viene interpretato come un argomento separato per il programma e il programma stesso può visualizzare tale argomento su una nuova riga, ma ciò non significa che sia stato convertito \n
in qualsiasi punto e sia interamente dipendente dal programma.
Questo mi ha portato lì ....
outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff
I rendimenti:
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]
Soluzione aggiuntiva:
In alcuni casi, devi fare l'eco su più righe dei contenuti lunghi (come codice / configurazioni)
Per esempio :
echo -e
,
printf
potrebbe avere qualche limitazione
È possibile utilizzare alcuni caratteri speciali come segnaposto come interruzione di riga (come ~
) e sostituirli dopo la creazione del file mediantetr
echo ${content} | tr '~' '\n' > $targetFile
deve invocare un altro programma ( tr
) che dovrebbe andare bene IMO.