bash中的Printf示例不会创建换行符

Wol*_*ble 24 bash printf

与工作printf在bash脚本,加入无空格后"\n"不创建换行符,而添加的空间中形成一个换行符,E.G.:

  1. 之后没有空间 "\n"

    NewLine=`printf "\n"`
    echo -e "Firstline${NewLine}Lastline"
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    FirstlineLastline
    
    Run Code Online (Sandbox Code Playgroud)
  2. 之后的空间 "\n "

    NewLine=`printf "\n "`
    echo -e "Firstline${NewLine}Lastline"
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    Firstline
     Lastline
    
    Run Code Online (Sandbox Code Playgroud)

问题:为什么不1.创建以下结果:

Firstline 
Lastline
Run Code Online (Sandbox Code Playgroud)

我知道这个特定的问题本来可以使用其他技术,但我想关注为什么1.不起作用.

编辑:当使用echo而不是printf时,我得到了预期的结果,但为什么printf的工作方式不同?

    NewLine=`echo "\n"`
    echo -e "Firstline${NewLine}Lastline"
Run Code Online (Sandbox Code Playgroud)

结果:

    Firstline
    Lastline
Run Code Online (Sandbox Code Playgroud)

Álv*_*lez 28

反引号运算符删除尾随的新行.见3.4.5.命令替换http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html

关于编辑问题的说明

相比:

[alvaro@localhost ~]$ printf "\n"

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


[alvaro@localhost ~]$
Run Code Online (Sandbox Code Playgroud)

\n除非您告诉他这样做,否则echo命令不会被视为换行符:

NAME
       echo - display a line of text
[...]
       -e     enable interpretation of backslash escapes
Run Code Online (Sandbox Code Playgroud)

POSIX 7 在此指定此行为:

[...]使用命令的标准输出,在替换结束时删除一个或多个字符的序列

  • 除了写入临时文件或管道之外,是否有 POSIX 7 解决方法可以避免这种行为(我想保留换行符)? (2认同)

Ser*_*reu 8

也许人们会带着我遇到的同样问题来到这里:在用 backsticks 包裹的代码中回显 \n。一个小技巧:

printf "astring\n"
# and 
printf "%s\n" "astring" 
# both have the same effect.
# So... I prefer the less typing one
Run Code Online (Sandbox Code Playgroud)

简短的回答是:

# 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\""
Run Code Online (Sandbox Code Playgroud)

一个常见的问题是,如果你在代码里面做:

echo 'Tomato is nice'
Run Code Online (Sandbox Code Playgroud)

当被 backsticks 包围时会产生错误

command Tomato not found.
Run Code Online (Sandbox Code Playgroud)

解决方法是添加另一个 echo -e 或 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
}
Run Code Online (Sandbox Code Playgroud)

现在您可以在提示符下调试您的代码:

(prompt)$  `mySuperFunction "arg1" "etc"`
Run Code Online (Sandbox Code Playgroud)

输出会很好

 mydebug: a value
 otherdebug: whathever appended using myecho
 a third string
Run Code Online (Sandbox Code Playgroud)

并在内部调试

mecho "a string to be hacktyped"
Run Code Online (Sandbox Code Playgroud)


小智 5

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

Firstline
Lastline

$ echo "Firstline${NewLine}Lastline"
Firstline
Lastline
Run Code Online (Sandbox Code Playgroud)