1

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

3 回答 3

3

第一个脚本使用cat(在这种情况下,输出它从输入接收到的所有内容),这里是 doc <<。这里的文档是向命令提供输入的方式,就好像它是从某种临时文件中接收的一样。

这是来自的参考man bash

这里的文件

这种类型的重定向指示 shell 从当前源读取输入,直到看到仅包含定界符(没有尾随空格)的行。然后将所有读取到该点的行用作命令的标准输入。

这里文档的格式是:

       <<[-]word
               here-document
       delimiter

不对 word 执行参数扩展、命令替换、算术扩展或路径名扩展。如果 word 中的任何字符被引用,则分隔符是 word 上去除引号的结果,并且 here-document 中的行不展开。如果 word 没有被引用,则 here-document 的所有行都经过参数扩展、命令替换和算术扩展。在后一种情况下,字符序列 \ 被忽略,并且必须使用 \ 来引用字符 \、$ 和 `。

如果重定向运算符是 <<-,则所有前导制表符都将从输入行和包含分隔符的行中删除。这允许 shell 脚本中的 here-documents 以自然的方式缩进。

于 2013-08-13T07:26:30.853 回答
2

如果您cat没有给出文件名(如问题),它将从标准输入中读取。<<-TAG问题中的代码使用...TAG语法从所谓的“here document”重定向标准输入,该语法写在脚本中。

然后cat将读取的内容输出到标准输出,与echo.

注意:-here 文档语法具有去除前导制表符的特殊含义,允许缩进“here 文档”。它可以被排除在外,只是<<TAG......TAG

于 2013-08-13T07:24:51.883 回答
1

cat 替代方案使用 here-doc。它实质上显示了整个文件的内容(在本例中为 here-doc)。如果您有一个包含 $title $HOSTNAME 的文件 website.txt

    <BODY>
    <H1>$title $HOSTNAME</H1>
    </BODY>
    </HTML>

你可以跑

猫网站.txt

以达到类似的效果。还要注意,如果

$title $主机名

被包括在内,显示这些变量的值(如果设置),而 cat 没有。

于 2013-08-13T14:40:43.197 回答