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.:
No hay espacio después de
"/n"
NewLine=`printf "/n"` echo -e "Firstline${NewLine}Lastline"
Resultado:
FirstlineLastline
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