¿Cómo puedo generar una cadena de varias líneas en Bash sin usar múltiples llamadas de eco de esta manera?
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
Estoy buscando una forma portátil de hacer esto, usando solo los componentes integrados de Bash.
echo >&2 ...
--help
(que debería ir a la salida estándar).printf
solución basada en Gordon Davidson. A pesar de estar a la sombra de los enfoquesecho
ocat
basados, parece ser mucho menos problemático. Es cierto que la sintaxis 'printf' representa una pequeña curva de aprendizaje, pero me gustaría conocer otros inconvenientes (? Compatibilidad, rendimiento? ...)Respuestas:
Aquí los documentos se utilizan a menudo para este propósito.
Se admiten en todos los shells derivados de Bourne, incluidas todas las versiones de Bash.
fuente
cat
no está integrado.read -d '' help <<- EOF ...
para leer la cadena multilínea en una variable y luego hice eco del resultado.o puedes hacer esto:
fuente
Inspirado por las respuestas perspicaces de esta página, creé un enfoque mixto, que considero el más simple y flexible. ¿Qué piensas?
Primero, defino el uso en una variable, lo que me permite reutilizarlo en diferentes contextos. El formato es muy simple, casi WYSIWYG, sin la necesidad de agregar ningún carácter de control. Esto me parece razonablemente portátil (lo ejecuté en MacOS y Ubuntu)
Entonces simplemente puedo usarlo como
o incluso mejor, cuando analizo los parámetros, puedo repetirlo allí en una sola línea:
fuente
echo "$__usage"
fue necesario para mí.echo $__usage
no funcionó.Use la
-e
opción, luego puede imprimir un nuevo carácter de línea\n
en la cadena.Muestra (pero no estoy seguro si es buena o no)
Lo divertido es que esa-e
opción no está documentada en la página de manual de MacOS mientras todavía se puede usar. Está documentado en la página del manual de Linux .fuente
echo
comando proporcionado por el sistema/bin/echo
, que en Mac OS no tiene-e
opción. cuando usas bash en esos sistemas, suecho
comando incorporado se hace cargo. Puede ver esto escribiendo explícitamente/bin/echo whatever
y observando la diferencia de comportamiento. Para ver la documentación para el incorporado, escribahelp echo
./bin/echo
A menudo es diferente de un sistema operativo a otro y diferente de Bash's incorporadoecho
.echo -e
no es portátil; por ejemplo, algunas implementaciones de echo imprimirán "-e" como parte de la salida. Si desea portabilidad, use printf en su lugar. Por ejemplo, / bin / echo en OS X 10.7.4 hace esto. IIRC, el eco integrado de bash también fue extraño en 10.5.0, pero ya no recuerdo los detalles.echo -e
me ha mordido antes ... Definitivamente usoprintf
ocat
con un heredoc. La<<-
variante de los documentos aquí es especialmente buena porque puede eliminar la sangría principal en la salida, pero sangrar paraComo recomendé
printf
en un comentario, probablemente debería dar algunos ejemplos de su uso (aunque para imprimir un mensaje de uso, es más probable que use las respuestas de Dennis o Chris).printf
es un poco más complejo de usar queecho
. Su primer argumento es una cadena de formato, en la que los escapes (como\n
) siempre se interpretan; también puede contener directivas de formato que comienzan con%
, que controlan dónde y cómo se incluyen argumentos adicionales. Aquí hay dos enfoques diferentes para usarlo para un mensaje de uso:Primero, puede incluir el mensaje completo en la cadena de formato:
Tenga en cuenta que
echo
, a diferencia , debe incluir la nueva línea final explícitamente. Además, si el mensaje contiene%
caracteres, deberían escribirse como%%
. Si desea incluir el informe de errores y las direcciones de la página de inicio, se pueden agregar de forma natural:En segundo lugar, puede usar la cadena de formato para que imprima cada argumento adicional en una línea separada:
Con esta opción, agregar el informe de errores y las direcciones de la página de inicio es bastante obvio:
fuente
También con el código fuente sangrado puede usar
<<-
(con un guión final) para ignorar las pestañas iniciales (pero no los espacios iniciales). Por ejemplo esto:Produce texto sangrado sin el espacio en blanco inicial:
fuente
Si usa la solución de @jorge y encuentra que todo está en la misma línea, asegúrese de incluir la variable entre comillas:
imprimirá todo en una línea mientras que
retendrá las nuevas líneas.
fuente
cat <<EOF .... EOF