web-dev-qa-db-fra.com

L'exemple Printf dans bash ne crée pas de nouvelle ligne

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.:

  1. Pas d'espace après "\n"

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

    Résultat:

    FirstlineLastline
    
  2. 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
27
WolfHumble

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

Remarque sur la question modifiée

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

28
Álvaro González
$ printf -v NewLine "\n"
$ echo -e "Firstline${NewLine}Lastline"

Firstline
Lastline

$ echo "Firstline${NewLine}Lastline"
Firstline
Lastline
4
Robert S

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"
4
Sergio Abreu

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
3
Dennis Williamson

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
3
an0nym0usc0ward

Nous n'avons pas besoin de "echo" ou "printf" pour créer la variable NewLine:

NewLine="
"
printf "%q\n" "${NewLine}"
echo "Firstline${NewLine}Lastline"
1
yabt