我想使用 echo 命令和重定向运算符创建一个文件,该文件应该由几行组成。
我尝试在字符串中包含“\n”换行符:
echo "first line\nsecond line\nthirdline\n" > foo
但是这样就不会创建包含三行的文件,而只会创建包含一行和字符串逐字内容的文件。
如何仅使用此命令创建包含多行的文件?
答案1
您要求在echo
命令中使用一些语法:
echo $'first line\nsecond line\nthirdline' > foo
(但也要考虑一下你得到的其他答案。)
该$'...'
结构扩展了嵌入的 ANSI 转义序列。
答案2
echo 对字符转义的作用是由实现定义的。在 echo 的许多实现中(包括大多数现代的实现),默认情况下根本不检查传递的字符串是否有转义。
使用 GNU bash(作为内置)提供的 echo 以及其他一些 echo 变体,您可以执行如下操作:
echo -en 'first line\nsecond line\nthird line\n' > file
然而,它听起来确实像你想要的那样printf
,这对我来说更清晰,也更便携(它具有 POSIX 定义的此功能):
printf '%s\n' 'first line' 'second line' 'third line' > file
您还可以考虑使用这里的文档:
cat > file << 'EOF'
first line
second line
third line
EOF
答案3
以下是使用命令创建多行文件的一些其他方法echo
:
echo "first line" > foo
echo "second line" >> foo
echo "third line" >> foo
其中第二个和第三个命令使用>>
重定向运算符,这会导致命令的输出被附加(添加)到文件(此时该文件应该已经存在)。
或者
(echo "first line"; echo "second line"; echo "third line") > foo
其中括号将echo
命令分组到一个子进程中,该子进程的外观和行为类似于输出多行的任何单个程序(例如ls
)。
上面的一个微妙的变化是
{ echo "first line"; echo "second line"; echo "third line";} > foo
这是轻微地比第二个答案更有效,因为它不会创建子流程。然而,语法有点棘手:请注意,在 后面必须有一个空格,{
在 之前有一个分号}
。
看shell 的控制和重定向运算符是什么?了解更多信息。
答案4
POSIX 7 说你不能
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
未定义,反斜杠是实现定义的:
如果第一个操作数是 -n,或者任何操作数包含 <反斜杠> 字符,则结果是实现定义的。
除非您有可选的 XSI 扩展。
所以使用printf
反而:
格式操作数应用作 XBD 文件格式表示法中描述的格式字符串 [...]
这文件格式表示法:
\n <newline> 将打印位置移动到下一行的开头。
另请记住,Ubuntu 15.10 和大多数发行版echo
都将两者实现为:
- 内置 Bash:
help echo
- 独立的可执行文件:
which echo
这可能会导致一些混乱。