Bash标准I / O.

时间:2013-08-13 07:16:36

标签: bash shell

首先,我只有一天的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>"

3 个答案:

答案 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

达到类似的效果。另请注意,如果包含

$ title $ HOSTNAME

,则显示这些变量的值(如果已设置),而cat则不显示。

相关问题