我想使用echo命令和重定向运算符创建一个文件,该文件应由几行组成。
我试图在字符串中用“ \ n”添加换行符:
echo "first line\nsecond line\nthirdline\n" > foo
但是这种方式不会创建三行的文件,而只会创建一行并包含字符串的逐字内容的文件。
如何仅使用此命令创建具有多行的文件?
我想使用echo命令和重定向运算符创建一个文件,该文件应由几行组成。
我试图在字符串中用“ \ n”添加换行符:
echo "first line\nsecond line\nthirdline\n" > foo
但是这种方式不会创建三行的文件,而只会创建一行并包含字符串的逐字内容的文件。
如何仅使用此命令创建具有多行的文件?
Answers:
您要求在echo
命令中使用一些语法:
echo $'first line\nsecond line\nthirdline' > foo
(但也请考虑您得到的其他答案。)
该$'...'
构造扩展了嵌入式ANSI转义序列。
回声对字符转义的作用是实现的定义。在echo的许多实现中(包括大多数现代的实现),默认情况下根本不检查传递的字符串是否进行转义。
使用GNU bash提供的回声(作为内置函数)和其他一些回声变体,您可以执行以下操作:
echo -en 'first line\nsecond line\nthird line\n' > file
但是,这听起来确实像您想要的printf
,这对我来说更清晰易懂,而且也更便于携带(它具有POSIX定义的此功能):
printf '%s\n' 'first line' 'second line' 'third line' > file
您也可以考虑使用here文档:
cat > file << 'EOF'
first line
second line
third line
EOF
echo -en 'text..'
,而接受的答案不承认我的换行符(\n
)时,echo -en
做了。
以下是使用该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
这比第二个答案稍有效率,因为它不会创建子流程。但是,语法有点棘手:请注意,您必须在后面有一个空格,在{
之前有一个分号}
。
请参阅外壳程序的控制和重定向运算符是什么?想要查询更多的信息。
POSIX 7说你不能
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
未定义,反斜杠是实现定义:
如果第一个操作数为-n,或者任何操作数包含<backslash>字符,则结果是实现定义的。
除非您具有可选的XSI扩展名。
因此printf
改用:
格式操作数应用作XBD文件格式符号[...]中描述的格式字符串
该文件格式符号:
\ n <newline>将打印位置移至下一行的开头。
还请记住,Ubuntu 15.10和大多数发行版都实现了以下echo
两者:
help echo
which echo
可能会导致一些混乱。
echo
系统上每个可用的shell中都将内置一个内置程序。在Ubuntu上,/ bin / sh通常是破折号,默认情况下还提供bash。zsh,rc,mksh,yash,csh,tcsh,ksh93 ...都会具有不同的行为而具有各自的回显。请注意,which echo
这不会为您提供所有Shell中系统回显的路径。
which
最初是(在80年代)仅用于csh用户的csh脚本(从〜/ .cshrc加载别名),并且仍在某些系统上。which
是zsh和tcsh的内置函数。