script programacion print ejemplos crear comando bash printf

programacion - Ejemplo de Printf en bash no crea una nueva línea



programacion bash windows (7)

El operador de backtick elimina las nuevas líneas. Ver 3.4.5. Sustitución de comandos en http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html

Nota sobre la pregunta editada

Comparar:

[alvaro@localhost ~]$ printf "/n" [alvaro@localhost ~]$ echo "/n" /n [alvaro@localhost ~]$ echo -e "/n" [alvaro@localhost ~]$

El comando echo no trata a /n como una nueva línea a menos que le digas que lo haga:

NAME echo - display a line of text [...] -e enable interpretation of backslash escapes

POSIX 7 especifica este comportamiento here :

con la salida estándar del comando, eliminando secuencias de uno o más caracteres al final de la sustitución

Trabajando con printf en un script bash, no agregar espacios después de "/n" no crea una nueva línea, mientras que agregar un espacio crea una nueva línea, e. sol.:

  1. No hay espacio después de "/n"

    NewLine=`printf "/n"` echo -e "Firstline${NewLine}Lastline"

    Resultado:

    FirstlineLastline

  2. Espacio después de "/n "

    NewLine=`printf "/n "` echo -e "Firstline${NewLine}Lastline"

    Resultado:

    Firstline Lastline

Pregunta: ¿Por qué no 1. crea el siguiente resultado:

Firstline Lastline

Sé que este problema específico se podría haber solucionado utilizando otras técnicas, pero quiero centrarme en por qué 1. no funciona.

Editado: cuando uso echo en lugar de printf, obtengo el resultado esperado, pero ¿por qué printf funciona de manera diferente?

NewLine=`echo "/n"` echo -e "Firstline${NewLine}Lastline"

Resultado:

Firstline Lastline


Funciona bien si agregas "/ r"

$ nl=`printf "/n/r"` && echo "1${nl}2" 1 2


No necesitamos "echo" o "printf" para crear la variable NewLine:

NewLine=" " printf "%q/n" "${NewLine}" echo "Firstline${NewLine}Lastline"


Parece que BASH está eliminando nuevas líneas finales. p.ej

NewLine=`printf " /n/n/n"` echo -e "Firstline${NewLine}Lastline" Firstline Lastline NewLine=`printf " /n/n/n "` echo -e "Firstline${NewLine}Lastline" Firstline Lastline


Su versión de echo editada está colocando una barra diagonal inversa literal en la variable $NewLine que luego se interpreta con su echo -e . Si hiciste esto en su lugar:

NewLine=$(echo -e "/n") echo -e "Firstline${NewLine}Lastline"

su resultado sería el mismo que en el caso # 1. Para hacer que uno funcione de esa manera, tendrías que escapar de la barra invertida y poner todo en comillas simples:

NewLine=$(printf ''//n'') echo -e "Firstline${NewLine}Lastline"

o doble escape:

NewLine=$(printf "///n")

Por supuesto, puede usar printf directamente o puede configurar su valor NewLine de la siguiente manera:

printf "Firstline/nLastline/n"

o

NewLine=$''/n'' echo "Firstline${NewLine}Lastline" # no need for -e


Tal vez la gente vendrá aquí con el mismo problema que tuve: haciéndome eco / n dentro de un código envuelto en backsticks. Un pequeño consejo:

printf "astring/n" # and printf "%s/n" "astring" # both have the same effect. # So... I prefer the less typing one

La respuesta corta es:

# Escape /n correctly ! # Using just: printf "$myvar/n" causes this effect inside the backsticks: printf "banana " # So... you must try //n that will give you the desired printf "banana/n" # Or even ////n if this string is being send to another place # before echoing, buffer="${buffer}////n printf /"$othervar////n/""

Un problema común es que si lo haces dentro del código:

echo ''Tomato is nice''

Cuando está rodeado de backsticks producirá el error

command Tomato not found.

La solución es agregar otro eco -e o printf

printed=0 function mecho(){ #First time you need an "echo" in order bash relaxes. if [[ $printed == 0 ]]; then printf "echo -e $1////n" printed=1 else echo -e "/r/n/r$1////n" fi }

Ahora puedes depurar tu código haciendo lo siguiente:

(prompt)$ `mySuperFunction "arg1" "etc"`

La salida será muy bien.

mydebug: a value otherdebug: whathever appended using myecho a third string

y depuración interna con

mecho "a string to be hacktyped"


$ printf -v NewLine "/n" $ echo -e "Firstline${NewLine}Lastline" Firstline Lastline $ echo "Firstline${NewLine}Lastline" Firstline Lastline