如何使用 echo 命令和重定向运算符将换行符特殊字符放入文件中?

Abd*_*red 56 command-line shell echo newlines

我想使用 echo 命令和重定向运算符创建一个文件,该文件应该由几行组成。

我试图通过“\n”在字符串中包含一个换行符:

echo "first line\nsecond line\nthirdline\n" > foo
Run Code Online (Sandbox Code Playgroud)

但是这样不会创建三行文件,而是创建一个只有一行和字符串的逐字内容的文件。

如何仅使用此命令创建多行文件?

Jan*_*nis 62

您要求在echo命令中使用一些语法:

echo $'first line\nsecond line\nthirdline' > foo
Run Code Online (Sandbox Code Playgroud)

(但也要考虑你得到的另一个答案。)

$'...'构造扩展了嵌入的 ANSI 转义序列。

  • @ChrisDown,它还不是 POSIX,但计划包含在第 8 期中。ksh93、bash、zsh、mksh、FreeBSD sh 支持它。 (2认同)

Chr*_*own 49

echo 对字符转义的作用是实现定义的。在 echo 的许多实现中(包括大多数现代实现),默认情况下根本不检查传递的字符串是否有转义。

使用 GNU bash 提供的 echo(作为内置)和其他一些 echo 变体,您可以执行以下操作:

echo -en 'first line\nsecond line\nthird line\n' > file
Run Code Online (Sandbox Code Playgroud)

然而,这听起来真的很像你想要的printf,这对我来说更清晰,也更便携(它具有由 POSIX 定义的此功能):

printf '%s\n' 'first line' 'second line' 'third line' > file
Run Code Online (Sandbox Code Playgroud)

您也可以考虑使用此处的文档

cat > file << 'EOF'
first line
second line
third line
EOF
Run Code Online (Sandbox Code Playgroud)


Sco*_*ott 7

以下是使用该echo命令创建多行文件的其他一些方法:

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo
Run Code Online (Sandbox Code Playgroud)

其中第二个和第三个命令使用>>重定向运算符,这会导致命令的输出附加(添加)到文件(此时应该已经存在)。

或者

(echo "first line"; echo "second line"; echo "third line") > foo
Run Code Online (Sandbox Code Playgroud)

其中括号将echo命令分组到一个子进程中,该子进程的外观和行为类似于任何输出多行的单个程序(ls例如 )。

上面的一个微妙的变化是

{ echo "first line"; echo "second line"; echo "third line";} > foo
Run Code Online (Sandbox Code Playgroud)

这是稍微比它不创建子进程的第二个答案更为有效。但是,语法稍微有点棘手:请注意,在 之后必须有一个空格,在{之前必须有一个分号}

请参阅shell 的控制和重定向运算符是什么?想要查询更多的信息。