与工作printf在bash脚本,加入无空格后"\n"不创建换行符,而添加的空间中形成一个换行符,E.G.:
之后没有空间 "\n"
NewLine=`printf "\n"`
echo -e "Firstline${NewLine}Lastline"
Run Code Online (Sandbox Code Playgroud)
结果:
FirstlineLastline
Run Code Online (Sandbox Code Playgroud)之后的空间 "\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 在此指定此行为:
[...]使用命令的标准输出,在替换结束时删除一个或多个字符的序列
也许人们会带着我遇到的同样问题来到这里:在用 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)