2012-06-10 16 views
134

Cómo puedo salida de una cadena multipline en Bash sin necesidad de utilizar múltiples llamadas de eco de este modo:Cómo generar una cadena multilínea en Bash?

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

Busco una manera portátil para hacer esto, usando solamente órdenes internas del golpe.

EDITAR

Esta es la solución que se me ocurrió, que es una variación de la respuesta de Dennis.

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

    Report bugs to: 
    up home page: 
EOF 

echo "$help" 
+4

Si va a dar salida a un mensaje de uso en respuesta a una invocación incorrecta, que normalmente enviar ese mensaje en su lugar a error estándar de salida estándar, con 'echo> & 2 ...' –

+2

@MarkReed El mensaje de uso se emite escribiendo '--help' (que debería ir a la salida estándar). – helpermethod

+0

Para otros que vienen, más información sobre "aquí documentos" está disponible: http://www.tldp.org/LDP/abs/html/here-docs.html –

Respuesta

144

Aquí documentos se utilizan a menudo para este propósito.

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

Report bugs to: 
up home page: 
EOF 

Se admiten en todas las shells derivadas de Bourne, incluidas todas las versiones de Bash.

+3

Sí, pero 'cat' no está incorporado. –

+4

@MarkReed: es cierto, pero está [siempre disponible] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html) (excepto posiblemente en circunstancias inusuales). –

+4

+1 Thx. Terminé usando 'read -d '' help << - EOF ...' para leer la cadena multilínea en una variable y luego hice eco del resultado. – helpermethod

11

Uso -e, entonces usted puede imprimir carácter de nueva línea con \n en la cadena.

Sample (pero no está seguro de si una buena o no)

Lo divertido es que -e opción no está documentado en MacOS's man page mientras que todavía utilizable. Está documentado en el man page of Linux.

+3

Esas páginas de manual corresponden al comando 'echo','/bin/echo', que en el sistema operativo Mac no tiene la opción '-e'. cuando usas bash en esos sistemas, su comando 'echo' incorporado toma el control. Puedes ver esto escribiendo explícitamente '/ bin/echo whatever' y observando la diferencia de comportamiento. Para ver la documentación del built-in, escriba 'help echo'. –

+0

'/ bin/echo' a menudo es diferente de un sistema operativo a otro y diferente del' eco' incorporado de Bash. –

+0

@MarkReed: Lo intentaré más tarde, pero gracias por la información. +1. Dejaré mi respuesta aquí, ya que hay bastante buena discusión. – nhahtdh

102

o se puede hacer esto:

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

Report bugs to: 
up home page: " 
+0

¿Es portátil, es decir, funciona con todas las versiones de Bash? – helpermethod

+2

Esto funcionará al menos de nuevo a bash 2. –

+1

@OliverWeiler: Funcionará incluso en las shells Bourne como Dash y la [Heirloom Bourne Shell] (http://heirloom.sourceforge.net/sh.html). –

16

Como recomendé printf en un comentario, probablemente debería dar algunos ejemplos de su uso (aunque para imprimir un mensaje de uso, sería más probable que use las respuestas de Dennis o Chris). printf es un poco más complejo de usar que echo. Su primer argumento es una cadena de formato, en la que los escapes (como \n) son siempre interpretados; también puede contener directivas de formato que comienzan con %, que controlan dónde y cómo se incluyen los argumentos adicionales. Aquí hay dos enfoques diferentes para usarlo para un mensaje de uso:

En primer lugar, se podría incluir el mensaje completo en la cadena de formato:

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

Tenga en cuenta que a diferencia de echo, debe incluir la nueva línea final de forma explícita. Además, si el mensaje contiene caracteres %, deberían escribirse como %%.Si usted quiere incluir los direcciones informe de errores y la página de inicio, pueden añadirse de forma natural:

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

segundo lugar, usted podría simplemente utilizar el formato de cadena a hacer que imprima de cada argumento adicional en una línea independiente:

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

con esta opción, la adición de las direcciones de notificación de errores y la página de inicio es muy obvio:

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

+1 ¡Agradable! ¡No sabía que podía proporcionar varios argumentos para printf! – helpermethod

0

también con el código fuente sangría puede utilizar < < - (con un trazo final) para ignorar las pestañas o espacios iniciales. Por ejemplo, esto:

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

salidas sangría de texto sin espacios iniciales:

line1 
line2 
Cuestiones relacionadas