为什么以下命令没有在生成的文件中插入换行符,该怎么办?
$ echo "Line 1\r\nLine2" >> readme.txt
$ cat readme.txt
Line 1\r\nLine2
\r
包含在输出中还是CRLF
换行的一部分?
为什么以下命令没有在生成的文件中插入换行符,该怎么办?
$ echo "Line 1\r\nLine2" >> readme.txt
$ cat readme.txt
Line 1\r\nLine2
\r
包含在输出中还是CRLF
换行的一部分?
Answers:
echo
一echo
,如果你做这严格遵循统一UNIX规范的实施将增加新行:
echo 'line1\nline2'
但这不是可靠的行为。实际上,实际上没有您可以期望的任何标准行为echo
。
string
要写入标准输出的字符串。如果第一个操作数为
-n
,或者任何操作数包含<\
反斜杠>字符,则结果是实现定义的。在符合XSI的系统上,如果第一个操作数为
-n
,则应将其视为字符串,而不是option。在任何自变量中,在符合XSI的系统上应识别以下字符序列:
\a
-编写<alert>。
\b
-编写<backspace>。
\c
-禁止<newline>,否则该<newline>将跟随输出中的最终参数。\c
参数后面的所有字符都将被忽略。
\f
-编写<form-feed>。
\n
-编写<newline>。
\r
-编写<carriage-return>。
\t
-编写<tab>。
\v
-编写<vertical-tab>。
\\
-写一个<反斜杠>字符。
\0num
-写入一个8位值,该值是零,一,二或三位八进制数num
。
因此,实际上没有任何通用的方法可以知道如何使用编写换行符echo
,只是您通常只能依靠这样echo
做。
一个bash
外壳通常不会不符合规范,并处理-n
和其他选项,但即使是不确定的。你可以做:
shopt -s xpg_echo
echo hey\\nthere
hey
there
如果已经使用build-time选项进行了构建,那么甚至没有必要bash
...
echo
默认情况下,使该内置扩展反斜杠转义字符,而不需要该-e
选项。这会将xpg_echo
shell选项的默认值设置为on
,这使Bash的echo
行为更像Single Unix Specification版本3中指定的版本。有关可识别的转义序列的说明,请参见Bash Builtinsecho
。
printf
另一方面,printf
相比较而言,的行为相当温和。
printf
添加了该实用程序以提供历史上由所提供的功能echo
。但是,由于现存的各个版本之间存在无法协调的差异,因此echo
该版本具有一些特殊功能,而这些功能则留给了printf
基于第九版系统中的一个的新实用程序。
它处理描述其参数的格式字符串-可以是任意数量的东西,但是对于字符串来说,要么是%b
yte字符串,要么是字面%s
量。除了%f
第一个参数中的%b
ormats之外,它的行为最像yte字符串参数,只是它不处理\c
转义符。
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
看到为什么printf
比echo
什么更好?更多。
echo() printf
您可能会写自己的符合标准的文件,echo
例如...
echo(){
printf '%b ' "$@\n\c"
}
...应该几乎总是自动执行正确的操作。
实际上,不... \n
如果最后一个参数以奇数个<backslashes>结尾,则会在参数的末尾打印一个文字。
但这不是:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
shopt -s xpg_echo
选项。echo
-e
-e
。我很惊讶没有人注意到,除了@HaydeSchiff
如果您的字符不属于消息,则可以通过sed传递消息
$ echo "Time on the next line:@$(date +"%Y-%m-%dT%T%z")" | sed -e's/@/\n/g'
Time on the next line:
2016-03-25T10:12:39-0500
echo
强制性的吗?您可以使用printf
。