Utilisation de printf
dans un script bash, sans ajout d'espaces après "\n"
ne crée pas de nouvelle ligne, alors que l'ajout d'un espace crée une nouvelle ligne, e. g.:
Pas d'espace après "\n"
NewLine=`printf "\n"`
echo -e "Firstline${NewLine}Lastline"
Résultat:
FirstlineLastline
Espace après "\n "
NewLine=`printf "\n "`
echo -e "Firstline${NewLine}Lastline"
Résultat:
Firstline
Lastline
Question: Pourquoi ne 1. crée-t-il pas le résultat suivant:
Firstline
Lastline
Je sais que ce problème spécifique aurait pu être résolu en utilisant d'autres techniques, mais je veux me concentrer sur pourquoi 1. ne fonctionne pas.
Modifié: Lorsque j'utilise echo au lieu de printf, j'obtiens le résultat attendu, mais pourquoi printf fonctionne-t-il différemment?
NewLine=`echo "\n"`
echo -e "Firstline${NewLine}Lastline"
Résultat:
Firstline
Lastline
L'opérateur backtick supprime les nouvelles lignes à la fin. Voir 3.4.5. Substitution de commandes sur http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html
Comparer:
[alvaro@localhost ~]$ printf "\n"
[alvaro@localhost ~]$ echo "\n"
\n
[alvaro@localhost ~]$ echo -e "\n"
[alvaro@localhost ~]$
La commande echo ne traite pas \n
en tant que nouvelle ligne, sauf si vous lui dites de le faire:
NAME
echo - display a line of text
[...]
-e enable interpretation of backslash escapes
POSIX 7 spécifie ce comportement ici :
[...] avec la sortie standard de la commande, suppression des séquences d'un ou plusieurs caractères à la fin de la substitution
$ printf -v NewLine "\n"
$ echo -e "Firstline${NewLine}Lastline"
Firstline
Lastline
$ echo "Firstline${NewLine}Lastline"
Firstline
Lastline
Peut-être que les gens viendront ici avec le même problème que moi: écho\n dans un code enveloppé dans des backsticks. Un petit conseil:
printf "astring\n"
# and
printf "%s\n" "astring"
# both have the same effect.
# So... I prefer the less typing one
La réponse courte est:
# 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 problème courant est que si vous faites dans le code:
echo 'Tomato is Nice'
lorsqu'il est entouré de bâtons produira l'erreur
command Tomato not found.
La solution consiste à ajouter un autre écho -e ou 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
}
Vous pouvez maintenant déboguer votre code en faisant juste dans Prompt:
(Prompt)$ `mySuperFunction "arg1" "etc"`
La sortie sera bien
mydebug: a value
otherdebug: whathever appended using myecho
a third string
et débogage en interne avec
mecho "a string to be hacktyped"
Votre version echo
éditée met une barre oblique inversée-n dans la variable $NewLine
qui est ensuite interprété par votre echo -e
. Si vous avez fait cela à la place:
NewLine=$(echo -e "\n")
echo -e "Firstline${NewLine}Lastline"
votre résultat serait le même que dans le cas # 1. Pour que ça fonctionne de cette façon, vous devez échapper à la barre oblique inverse et mettre le tout entre guillemets simples:
NewLine=$(printf '\\n')
echo -e "Firstline${NewLine}Lastline"
ou double-y échapper:
NewLine=$(printf "\\\n")
Bien sûr, vous pouvez simplement utiliser printf
directement ou vous pouvez définir votre valeur NewLine comme ceci:
printf "Firstline\nLastline\n"
ou
NewLine=$'\n'
echo "Firstline${NewLine}Lastline" # no need for -e
Il semble que BASH supprime les nouvelles lignes de fin. par exemple.
NewLine=`printf " \n\n\n"`
echo -e "Firstline${NewLine}Lastline"
Firstline Lastline
NewLine=`printf " \n\n\n "`
echo -e "Firstline${NewLine}Lastline"
Firstline
Lastline
Nous n'avons pas besoin de "echo" ou "printf" pour créer la variable NewLine:
NewLine="
"
printf "%q\n" "${NewLine}"
echo "Firstline${NewLine}Lastline"