在bash脚本中使用printf
,"\n"
之后不添加空格不会创建换行符,而添加空格会创建换行符,例如: g。:
"\n"
NewLine=`printf "\n"`
echo -e "Firstline${NewLine}Lastline"
结果:
FirstlineLastline
"\n "
NewLine=`printf "\n "`
echo -e "Firstline${NewLine}Lastline"
结果:
Firstline
Lastline
问题:为什么不1.创建以下结果:
Firstline
Lastline
我知道这个具体问题本来可以使用其他技术,但我想关注为什么1.不起作用。
编辑: 当使用echo而不是printf时,我得到了预期的结果,但为什么printf的工作方式不同?
NewLine=`echo "\n"`
echo -e "Firstline${NewLine}Lastline"
结果:
Firstline
Lastline
答案 0 :(得分:26)
反引号操作符删除尾随的新行。见 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 ~]$
echo命令不会将\n
视为换行符,除非您告诉他这样做:
NAME
echo - display a line of text
[...]
-e enable interpretation of backslash escapes
POSIX 7指定此行为here:
[...]使用命令的标准输出,删除替换结尾处的一个或多个字符的序列
答案 1 :(得分:4)
$ printf -v NewLine "\n"
$ echo -e "Firstline${NewLine}Lastline"
Firstline
Lastline
$ echo "Firstline${NewLine}Lastline"
Firstline
Lastline
答案 2 :(得分:3)
看起来BASH正在删除尾随换行符。 e.g。
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 :(得分:3)
您修改后的echo
版本会将一个字面反斜杠-n放入变量$NewLine
,然后由echo -e
解释。如果你这样做了:
NewLine=$(echo -e "\n")
echo -e "Firstline${NewLine}Lastline"
您的结果与案例#1相同。要使那个以这种方式工作,你必须逃避反斜杠并将整个内容放在单引号中:
NewLine=$(printf '\\n')
echo -e "Firstline${NewLine}Lastline"
或双重逃避:
NewLine=$(printf "\\\n")
当然,您可以直接使用printf
,也可以像这样设置NewLine值:
printf "Firstline\nLastline\n"
或
NewLine=$'\n'
echo "Firstline${NewLine}Lastline" # no need for -e
答案 4 :(得分:3)
也许人们会带着同样的问题来到这里: 在包含在后台的代码中回显\ n。小提示:
printf "astring\n"
# and
printf "%s\n" "astring"
# both have the same effect.
# So... I prefer the less typing one
简短的回答是:
# 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\""
一个常见的问题是,如果你在代码中执行:
echo 'Tomato is nice'
当用后挡板包围时会产生错误
command Tomato not found.
解决方法是添加另一个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
}
现在您可以在提示符下调试代码:
(prompt)$ `mySuperFunction "arg1" "etc"`
输出很好
mydebug: a value
otherdebug: whathever appended using myecho
a third string
并在
内部进行调整mecho "a string to be hacktyped"
答案 5 :(得分:1)
我们不需要“echo”或“printf”来创建NewLine变量:
NewLine="
"
printf "%q\n" "${NewLine}"
echo "Firstline${NewLine}Lastline"
答案 6 :(得分:0)
对于那些想知道如何在printf
的参数中使用换行符的人,请使用%b
而不是%s
:
$> printf "a%sa" "\n"
a\na
$> printf "a%ba" "\n"
a
a
从手册:
%b在相应的参数中扩展反斜杠转义序列
答案 7 :(得分:-2)
如果添加“\ r”
,则无效$ nl=`printf "\n\r"` && echo "1${nl}2" 1 2