bash中的Printf示例不创建换行符
在bash脚本中使用bash中的Printf示例不创建换行符,bash,printf,Bash,Printf,在bash脚本中使用printf,在“\n”之后不添加空格不会创建换行符,而添加空格会创建换行符,例如: “\n” 结果: FirstlineLastline Firstline Lastline Firstline Lastline “\n” 结果: FirstlineLastline Firstline Lastline Firstline Lastline 问题:1为什么不呢。创建以下结果: Firstline Lastline 我知
printf
,在“\n”
之后不添加空格不会创建换行符,而添加空格会创建换行符,例如:
“\n”
结果:
FirstlineLastline
Firstline
Lastline
Firstline
Lastline
“\n”
结果:
FirstlineLastline
Firstline
Lastline
Firstline
Lastline
Firstline
Lastline
我知道这个特定的问题可以通过使用其他技术来解决,但我想重点讨论为什么1。不起作用
编辑:
当使用echo而不是printf时,我得到了预期的结果,但是printf的工作方式为什么不同呢
NewLine=`echo "\n"`
echo -e "Firstline${NewLine}Lastline"
结果:
FirstlineLastline
Firstline
Lastline
Firstline
Lastline
看起来BASH正在删除尾随的换行符。 e、 g 如果添加“\r”,则工作正常 $nl=`printf“\n\r”`&&echo“1${nl}2” 1. 2.
backtick操作符删除尾随的新行。见3.4.5。命令替换at 关于已编辑问题的说明 比较:
[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规定了这种行为:
[…]使用命令的标准输出,删除替换结束时一个或多个字符的序列
您编辑的
echo
版本在变量$NewLine
中放入一个反斜杠-n,然后由echo-e
解释。如果您这样做:
NewLine=$(echo -e "\n")
echo -e "Firstline${NewLine}Lastline"
您的结果将与案例1中的结果相同。要使这一点起作用,您必须避开反斜杠,并将整个内容放在单引号中:
NewLine=$(printf '\\n')
echo -e "Firstline${NewLine}Lastline"
或者双重逃避:
NewLine=$(printf "\\\n")
当然,您可以直接使用printf
,也可以这样设置换行符值:
printf "Firstline\nLastline\n"
或
我们不需要“echo”或“printf”来创建换行变量:
NewLine="
"
printf "%q\n" "${NewLine}"
echo "Firstline${NewLine}Lastline"
也许人们会带着和我一样的问题来到这里: 在用backstick包装的代码中\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"
对于想知道如何在
printf
的参数中使用换行符的人,请使用%b
而不是%s
:
$>printf“a%sa”“\n
a\n
$>printf“a%ba”“\n
A.
A.
从手册中:
%b在相应的参数中展开反斜杠转义序列
Windows换行符是\r\n,如果您所指的是:-?这令人困惑,如果要挑剔的话,也是错误的。例如:在第二个代码块中,您说您转义了换行符,但实际上您只转义了反斜杠(“转义”)。很抱歉造成混淆。我会尽力澄清的。谢谢。对于这个答案也是如此。根据系统的说法,我们无法更新它,因为“它太旧了,需要更改”。问题是,这篇文章编辑部分的例子似乎并非如此,即部分:NewLine=
echo“\n”
,因此我想结论是:1)Printf在这种情况下的工作方式与echo不同,因为echo需要“-e”为了创建实际的换行符2)删除printf和echo-e中的所有后续换行符,如中所述:下面丹尼斯·威廉姆森先生的帖子也有助于指出这些问题。谢谢!除了写入临时文件或管道之外,是否有POSIX 7解决方案来避免这种行为(我想保留换行符)?这是我的解决方案,至少从2011年起就可以使用(Bash 4.2.46)。非常感谢。