首先,我只有一天的bash经验,所以对大多数人来说,我的问题可能非常简单。这是我的问题:下面显示的2个代码做同样的工作,但是由于I / O,在其中一个中我不必使用echo
命令。我不明白为什么。有没有人可以帮助我?提前谢谢。
#!/bin/bash
# make_page ----- A script to produce an HTML file------
title="System information for"
cat <<- _EOF_
<HTML>
<HEAD>
<TITLE>
$title $HOSTNAME
</TITLE>
</HEAD>
<BODY>
<H1>$title $HOSTNAME</H1>
</BODY>
</HTML>
_EOF_
我应该使用echo的第二个:
#!/bin/bash
# make_page - A script to produce an HTML file
echo "<HTML>"
echo "<HEAD>"
echo " <TITLE>"
echo " The title of your page"
echo " </TITLE>"
echo "</HEAD>"
echo ""
echo "<BODY>"
echo " Your page content goes here."
echo "</BODY>"
echo "</HTML>"
答案 0 :(得分:3)
第一个脚本使用cat
(在这种情况下,输出从输入中收到的所有内容),此处为文档<<
。这里的文档是为命令提供输入的方式,就好像它是从一种临时文件中收到的。
以下是man bash
此处文件
这种重定向指示shell从中读取输入 当前源直到一行只包含分隔符(没有 可见尾随空白)。所有读到的那一行都是 然后用作命令的标准输入。
here-documents的格式为:
<<[-]word here-document delimiter
无参数扩展,命令替换,算术扩展或 路径名扩展是在word上执行的。如果有任何字符 引用的单词,分隔符是单词引用删除的结果, 并且不会扩展here-document中的行。如果是的话 如果没有引用,here-document的所有行都会受到参数的影响 扩展,命令替换和算术扩展。在 后一种情况,字符序列\被忽略,并且 必须用来引用字符\,$和`。
如果重定向运算符是&lt;&lt; - ,那么所有前导制表符都是 从输入行和包含分隔符的行中删除。 这允许shell脚本中的文档在a中缩进 自然时尚。
答案 1 :(得分:2)
如果您给cat
没有文件名(如有问题),它将从标准输入中读取。问题中的代码使用<<-TAG
... TAG
语法从所谓的"here document"重定向标准输入,该语法写在脚本中。
然后cat
将其读取的内容输出到标准输出,与echo
相同。
注意:here here语法中的-
具有剥离前导标签的特殊含义,允许缩进“here document”。它可以省略,只需<<TAG
... TAG
。
答案 2 :(得分:1)
cat替代方案使用here-doc。它基本上显示整个文件的内容(在本例中为here-doc)。如果你有一个包含的文件website.txt $ title $ HOSTNAME
<BODY>
<H1>$title $HOSTNAME</H1>
</BODY>
</HTML>
你可以运行
cat website.txt
达到类似的效果。另请注意,如果包含