Guiones en printf


37

Estoy tratando de usar printf para formatear una salida bonita en un script bash

p.ej:
-----------------------
| This is some output |
-----------------------

Pero me he tropezado con un comportamiento que no entiendo.

$ printf "--" me da el error printf: usage: printf [-v var] format [arguments]

y $ printf "-stuff"resultados en-bash: printf: -s: invalid option

Entonces, aparentemente printf piensa que estoy tratando de pasar algunos argumentos mientras no lo estoy.

Mientras tanto, completamente por accidente, he encontrado esta solución:
$ printf -- "--- this works now ----\n"me da--- this works now ----

¿Alguien puede explicar este comportamiento?



Fuera de interés, ¿hay alguna implementación de echoeso que fallaría al hacerlo echo ------------? La mayoría solo admite -n(sin línea posterior), -e(interpreta caracteres con barra invertida) y posible -E(NO los interpreta) y no genera errores cuando se encuentran otros argumentos similares a las opciones, ¿verdad? (EDITAR: GNU /bin/echotambién es compatible --helpy --version.)
Janmoesen

Respuestas:


44

El --se utiliza para indicar al programa que lo que sigue debe no ser interpretado como una línea de comandos opción a printf.

Editar: por lo tanto, lo printf "--"que intentó básicamente terminó como "printf sin argumentos" y, por lo tanto, falló.


19
En otras palabras, para imprimir --puedes correr printf -- --.
l0b0

2
... y printf --es lo mismo que printf(recibes el mismo mensaje)
Peter.O

Tenga en cuenta que printf -- $fmtno es portátil. En busybox 1.30.1, printf -- '%s\n' hellorendimientos --. Ver también: pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
kelvin

25

-- se interpreta como una opción (en este caso, para indicar que no hay más opciones).

Siempre se debe incluir una cadena de formato cuando se usa printfpara evitar una mala interpretación. Para su caso particular:

printf '%s\n' '-----------------------'

¿Qué pasa cuando necesitas hacer esto con una secuencia? printf '-%.0s' {1..54}
qodeninja

2
Entonces @qodeninja que realmente hace que quiera usar --:-)printf -- '-%.0s' {1..54}
Chris abajo

4

Hay diferencias entre printf incorporado y / usr / bin / printf, el segundo hace "lo que quieres decir" sin estos molestos errores.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.