为什么以下命令不在生成的文件中插入新行,解决方案是什么?
$ echo "Line 1\r\nLine2" >> readme.txt
$ cat readme.txt
Line 1\r\nLine2
答案1
将 -e 标志传递给 echo 以使其解析转义字符,例如“\r\n”,如下所示:
echo -e "Line 1\r\nLine2" >> readme.txt
答案2
echo
echo
如果您这样做,严格符合 Single Unix 规范的实现将添加换行符:
echo 'line1\nline2'
但这不是一个可靠的行为。事实上,确实有不是您可以期望的任何标准行为echo
。
string
要写入标准输出的字符串。如果第一个操作数是
-n
,或者任何操作数包含<\
反斜杠>性格,结果由实现定义。在符合 XSI 标准系统中,如果第一个操作数是
-n
,则应将其视为字符串,不是一个选择。在任何参数中,以下字符序列应在符合 XSI 的系统上被识别:
\a
- 写一个<警报>。
\b
- 写一个<退格键>。
\c
- 抑制<换行>否则跟随输出中的最后一个参数。参数中跟随的所有字符都\c
将被忽略。
\f
- 写一个<换页>。
\n
- 写一个<换行>。
\r
- 写一个<回车>。
\t
- 写一个<选项卡>。
\v
- 写一个<垂直制表符>。
\\
- 写一个<反斜杠>特点。
\0num
- 写入一个 8 位值,即零、一、二或三位数的八进制数num
。
因此,确实没有任何通用方法可以知道如何使用 编写换行符echo
,除非您通常可以依靠这样做echo
。
shellbash
通常会执行以下操作:不是符合规范,并处理-n
和其他选项,但即使如此也是不确定的。你可以做:
shopt -s xpg_echo
echo hey\\nthere
hey
there
和甚至不是那个如果bash
是使用构建时选项构建的,则这是必要的...
默认情况下,内置
echo
扩展反斜杠转义字符,无需该-e
选项。这设置了默认值xpg_echo
外壳选项on
,这使得 Bash 的echo
行为更像单一 Unix 规范版本 3 中指定的版本。请参阅Bash 内置函数,了解可识别的转义序列的描述echo
。
printf
另一方面,printf
相比之下, 的行为却相当温和。
添加该
printf
实用程序是为了提供历史上由echo
.然而,由于不可调和的分歧在现有的各个版本中echo
,该版本几乎没有什么特殊功能,这些都留给了这个新printf
实用程序,它基于第九版系统中的一个。扩展描述部分几乎完全匹配
printf()
ISO C 标准中的函数,尽管它是按照文件格式符号进行描述的XBD 文件格式表示法。
它处理描述其参数的格式字符串 - 可以是任意数量的东西,但对于字符串来说几乎要么是%b
yte 字符串,要么是文字%s
字符串。除了%f
第一个参数中的格式之外,它的行为最像yte%b
字符串参数,只是它不处理转义\c
。
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
看为什么printf
优于echo
?了解更多。
echo() printf
您可以编写自己的标准,echo
例如......
echo(){
printf '%b ' "$@\n\c"
}
...这应该总是自动做正确的事情。
\n
实际上,不...如果最后一个参数以奇数结尾,则在参数的末尾打印一个文字<反斜杠>。
但这并没有:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
答案3
在我使用过的所有版本的 bash 中,您可以简单地以交互方式或在脚本中将文字换行符插入到字符串中,前提是该字符串被充分引用。
互动式:
$ echo "Line one
> Line two"
Line one
Line two
$
在脚本中:
echo "Line one
Line two"
答案4
人们已经给出了充分的答案,但我拒绝接受 echo 接受除 之外的任何选项的世界-n
。
nl='
'
echo Line 1"$nl"Line 2"$nl"Line 3