2012-06-10 19 views
134

Come posso uscita una stringa multipline in Bash senza utilizzare le chiamate eco multiplo in questo modo:Come stampare una stringa multilinea in Bash?

echo "usage: up [--level <n>| -n <levels>][--help][--version]" 
echo 
echo "Report bugs to: " 
echo "up home page: " 

Sto cercando un modo per fare questo portatile, utilizzando solo builtin Bash.

EDIT

Questa è la soluzione mi è venuta, che è una variante della risposta di Dennis.

opzione
read -d '' help <<- EOF 
    usage: up [--level <n>| -n <levels>][--help][--version] 

    Report bugs to: 
    up home page: 
EOF 

echo "$help" 
+4

Se stai output un messaggio d'aiuto in risposta ad un'invocazione non corretta, si farebbe normalmente inviare quel messaggio a standard error invece di standard output, con 'echo> & 2 ...' –

+2

@MarkReed Il messaggio di utilizzo viene emesso digitando '--help' (che dovrebbe andare a standard out). – helpermethod

+0

Per gli altri che arrivano, maggiori informazioni su "qui documenti" sono disponibili: http://www.tldp.org/LDP/abs/html/here-docs.html –

risposta

144

Qui i documenti sono spesso utilizzati per questo scopo.

cat << EOF 
usage: up [--level <n>| -n <levels>][--help][--version] 

Report bugs to: 
up home page: 
EOF 

Sono supportati in tutte le shell derivate da Bourne incluse tutte le versioni di Bash.

+3

Sì, ma 'cat' non è un built-in. –

+4

@MarkReed: È vero, ma è [sempre disponibile] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html) (tranne forse in circostanze insolite). –

+4

+1 Thx. Ho finito per usare l'aiuto di 'read -d '' << - EOF ...' per leggere la stringa multilinea in una variabile e quindi echeggiare il risultato. – helpermethod

11

Usa -e, quindi è possibile stampare carattere new line con \n nella stringa.

Sample (ma non so se una buona o no)

La cosa divertente è che -e opzione non è documentato in MacOS's man page mentre ancora utilizzabile. È documentato nello man page of Linux.

+3

Queste pagine man sono per il comando 'echo' fornito dal sistema,'/bin/echo', che su Mac OS non ha l'opzione '-e'. quando usi bash su quei sistemi, il comando integrato "echo' prende il sopravvento. Potete vederlo digitando esplicitamente '/ bin/echo qualunque 'e osservando la differenza di comportamento. Per vedere la documentazione per il built-in, digitare 'help echo'. –

+0

'/ bin/echo' è spesso diverso da un sistema operativo a un altro e diverso da 'echo' incorporato in Bash. –

+0

@MarkReed: ci proverò più tardi, ma grazie per le informazioni. +1. Lascerò la mia risposta qui, dato che ci sono molte discussioni in corso. – nhahtdh

102

o si può fare questo:

echo "usage: up [--level <n>| -n <levels>][--help][--version] 

Report bugs to: 
up home page: " 
+0

È portatile, cioè funziona con tutte le versioni di Bash? – helpermethod

+2

Questo funzionerà almeno fino a bash 2. –

+1

@OliverWeiler: Funzionerà anche in shell Bourne come Dash e [Heirloom Bourne Shell] (http://heirloom.sourceforge.net/sh.html). –

16

Poiché ho consigliato printf in un commento, dovrei probabilmente fornire alcuni esempi del suo utilizzo (sebbene per la stampa di un messaggio di utilizzo, sarei più propenso a utilizzare le risposte di Dennis o di Chris). printf è un po 'più complesso da usare di echo. Il primo argomento è una stringa di formato, in cui gli escape (come \n) sono interpretati sempre; può anche contenere direttive di formato che iniziano con %, che controllano dove e come sono inclusi eventuali argomenti aggiuntivi. Qui ci sono due diversi approcci per utilizzarlo per un messaggio d'aiuto:

In primo luogo, si potrebbe includere l'intero messaggio nella stringa di formato:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: \nup home page: \n" 

Si noti che diversamente echo, è necessario includere il ritorno a capo finale in modo esplicito. Inoltre, se il messaggio contiene caratteri %, dovrebbero essere scritti come %%.Se si voleva includere gli indirizzi bugreport e homepage, possono essere aggiunti del tutto naturale:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: %s\nup home page: %s\n" "$bugreport" "$homepage" 

In secondo luogo, si potrebbe utilizzare la stringa di formato per renderlo stampare ogni ulteriore argomento su una riga separata:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: " "up home page: " 

con questa opzione, aggiungendo gli indirizzi bugreport e homepage è abbastanza ovvio:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: $bugreport" "up home page: $homepage" 
+0

+1 Bello! Non sapevo che potresti fornire diversi argomenti per printf! – helpermethod

0

anche con il codice sorgente rientrato è possibile utilizzare < 012.- (con un trattino finale) per ignorare le schede o gli spazi iniziali. Per esempio, questo:

if [ some test ]; then 
    cat <<- xx 
     line1 
     line2 
xx 
fi 

uscite rientrate testo senza gli spazi principali:

line1 
line2 
Problemi correlati