我在终端写这个:
printf ' \n\necho -e \"writes (>> appends) in note.txt this text'\n'on 2lines (with "-e" and "'\n'" help)\" >> note.txt\n' > note.txt
Run Code Online (Sandbox Code Playgroud)
我得到了这个note.txt:
echo -e "writes (>> appends) in note.txt this textnon 2lines (with "-e" and "n" help)" >> note.txt
Run Code Online (Sandbox Code Playgroud)
我想把它放进去note.txt:
echo -e "writes (>> appends) in note.txt this text\non 2lines (with "-e" and "\n" help)" >> note.txt
Run Code Online (Sandbox Code Playgroud)
( \- 不见了)
\您不想转义其他字符的实例。根据您的字符串的内容,您可能想要:
echo -e 'writes (>> appends) in note.txt this text\non 2 lines (with "-e" and "\\n" help)' >> note.txtRun Code Online (Sandbox Code Playgroud)
附加的文本note.txt是:
writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
Run Code Online (Sandbox Code Playgroud)
变化是:
/n找到了想要换行的地方。所以我把它改成\n.with "-e" and "\n", the\旨在按字面打印,而不是与n下面的 it 组合并产生换行符。所以我\用另一个\. 如果\n产生一个新行,\\n产生\n。我"用单引号 ( ')替换了外部双引号 ( )。你想要的"周围人物-e和\n按字面打印的,而是他们结束并重新开始报价,防止它们被打印并造成\n实际被打印成n(因为不带引号的\n被传递到前处理echo)。另一种解决方案是\"为内部"字符编写。但是没有理由用双引号将整个内容括起来——在可以使用任何一个的情况下,单引号通常更可取。
另一个改变——不是对最终命令的改变,而是我在处理它时所做的改变——是我删除了>> note.txt重定向,直到我知道我拥有正确的命令。通过将输出发送到终端,我立即能够看到效果是什么。完成后我重新添加了重定向。
这在风格上与您已有的最接近,但这不是唯一的方法。
echo为单独的行分开命令,而不是使用-e.由于您希望通过 echo 专门处理的唯一序列是\n( betweentext和on),因此您可以只使用两个单独的echo命令,并且(如muru 可能建议的那样)不要使用-e.
以下是重定向多个命令的输出的两种方法:
两个单独的重定向,每个命令一个。
writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
Run Code Online (Sandbox Code Playgroud)
如果文件名很长或者您正在编写脚本并且只想在一个地方更改它,您可以将它分配给一个变量:
echo 'writes (>> appends) in note.txt this text' >> note.txt
echo 'on 2 lines (with "-e" and "\n" help)' >> note.txt
Run Code Online (Sandbox Code Playgroud)应用于由两个命令组成的复合命令的单个重定向。
out="/home/ek/Documents/long name that can have spaces as it's quoted/note.txt"
echo 'writes (>> appends) in note.txt this text' >> "$out"
echo 'on 2 lines (with "-e" and "\n" help)' >> "$out"
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以将其放在一行上,但如果在右大括号 ( })之前没有换行符,则;必须在它前面加上一个分号 ( ):
{
echo 'writes (>> appends) in note.txt this text'
echo 'on 2 lines (with "-e" and "\n" help)'
} >> note.txt
Run Code Online (Sandbox Code Playgroud)\n给echo而不是使用-e.真正的换行符可以出现在引号内(单引号或双引号)并按字面解释:
{ echo 'writes (>> appends) in note.txt this text'; echo 'on 2 lines (with "-e" and "\n" help)'; } >> note.txtRun Code Online (Sandbox Code Playgroud)
由于第一行在引号内结束,shell 不会将其作为命令的结尾,而是继续读取。
如果您确实想将其放在一行中,则可以使用$'\n',它会扩展为换行符。这在传递给echo命令之前由 shell 展开,因此不应引用它。
echo 'writes (>> appends) in note.txt this text'$'\n''on 2 lines (with "-e" and "\n" help)' >> note.txtRun Code Online (Sandbox Code Playgroud)
printfprintf非常强大;有多种方法可以使用它来解决这个问题。由于我将此作为与其他解决方案不同的解决方案,因此这是一种以您无法使用的方式使用它的好方法echo:
echo 'writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)' >> note.txt
Run Code Online (Sandbox Code Playgroud)
的一般语法printf是printf format args...(其中args...表示零个或多个附加命令行参数)。上面的格式字符串%s\n%s\n, 表示:
%s:消耗并打印下一个未使用的(即第一个)参数args...(即您的第一行)。\n: 打印换行符。%s:消耗并打印下一个未使用的(即第二个)参数 args...(即您的第二行)。\n: 打印换行符。当格式字符串后面的参数比格式字符串要求的多时,printf命令从格式字符串的开头重新开始。因此,虽然自我记录较少,但您实际上可以只为格式字符串编写'%s\n'(而不是'%s\n%s\n'),并且在这种情况下它会产生相同的输出。
我不会试图在printf这里广泛记录。相反,请参阅:
help printf。printf的第4.2击内置命令在bash的参考手册。printf()标准 C 库中的函数,该printf命令基于该函数,并且在上述资源中明确引用。其上的文档(例如此页面)比printf命令中的大多数来源更全面且更易于访问。和格式字符串语法非常相似。cathere文件。当有大量输入和脚本时,这种方式特别有价值。如果您以交互方式使用 shell 而不是编写脚本,则可以使用它,但请先考虑下面的方式 6。
Whileecho和printfprint 基于其命令行参数的内容打印文本,cat打印其输入文件的内容(在命令行中指定),或者,如果没有(或通过-),则打印其标准 input。
没有重定向,标准输入就是您在程序的控制终端上键入的内容。这里的文件是一种特殊的重定向。收集行,直到指定的关键字(我使用过EOF)单独出现在一行上。然后将行到但不包括EOF(或您使用的任何内容)作为正在运行的命令的标准输入。
echo 'writes (>> appends) in note.txt this text'$'\n''on 2 lines (with "-e" and "\n" help)' >> note.txtRun Code Online (Sandbox Code Playgroud)
用"和引用之间的区别之一'是大多数扩展和替换$(例如,$varname)在双引号中执行,但没有一个在单引号中。也有两种使用 here 文档的方法,根据是$(以及`和\)是否被赋予特殊含义或按字面处理。
在这种情况下,这无关紧要 -$并且`不会出现,并且\仅当它转义shell 元字符(不是n)时才在 here 文档中被特殊处理。就像在单引号和双引号表达式中一样,两种方式都按\n字面意思处理。(请记住,您必须使用 的特殊功能echo,由 开启-e,才能得到\n特殊对待。)
但是你知道其他应用程序:
$,`和\special 当它们出现在其特殊含义适用的上下文中时。<<与',",\,或它们的组合(例如,cat >> note.txt << 'EOF')。cat没有任何输入重定向的情况下使用。如果您以交互方式使用 shell,默认情况下,shell 的标准输入来自您的终端。当您然后运行一个程序时,默认情况下该程序的标准输入也来自您的终端。(当然,这可能会通过输入重定向来改变。)
因此,如果您以交互方式运行命令并希望使用catwith>>或>output 重定向将数据发送到文件,则不需要任何输入重定向。只需输入:
printf '%s\n%s\n' 'writes (>> appends) in note.txt this text' 'on 2 lines (with "-e" and "\n" help)' >> note.txt
Run Code Online (Sandbox Code Playgroud)
代替^D,不要输入文字^D。而是按Ctrl+ D。这向您的终端发出信号,它应该报告文件结尾(即,当正在运行的程序要求更多输入时,它被告知没有剩余,就像它已经到达存储在磁盘上的常规文件的末尾一样) . 当cat看到没有更多输入时,它退出,您将返回到 shell。
如果您正在编写脚本,则方式 6 将不起作用,因为 bash 从文件中读取命令,但标准输入仍然(通常)是其他内容,例如您的终端。
使用cathere 文档和使用没有输入重定向的 cat之间的一个显着区别是,即使标准输入是您的终端,也是如此:
cat >> note.txt一次写入一行到note.txt. 每按一次Enter,就会向 写入一行note.txt。cat >> note.txt << EOF将所有输入带到该EOF行,然后将其附加到note.txt. 如果您按Ctrl+中断输入C,则不会写入任何内容(如果note.txt不存在,则甚至不会创建)。好吧,我希望这能满足您的需求:
nano echo -e 'writes(>> appends) in note.txt this text/non 2lines (with "-e" and "\n" help)' >> note.txt这就是我从您的问题中得到的) shell 会插入反斜杠等特殊字符,除非它被单引号括起来。
echo接受以破折号开头的参数,因此为了更加安全,您应该printf改为使用,如下所示:
$ printf %s 'A \n B \n'
A \n B \n
Run Code Online (Sandbox Code Playgroud)
%s只是意味着打印我作为参数传递的字符串。它经常这样使用:
$ variable=Flimm
$ printf '%s is all right\n' "$variable"
Flimm is all right
Run Code Online (Sandbox Code Playgroud)
您可以在命令的联机帮助页中找到有关 Bash 插值的更多信息bash
,搜索标题为“引用”的部分。另请参阅该printf命令的联机帮助页
.
| 归档时间: |
|
| 查看次数: |
14065 次 |
| 最近记录: |