Heredoc bash中的输入语法



我目前正在通过Ubuntu 16中的终端学习Unix Bash。我正在编写一个简单的脚本,因此我可以练习为Unix编写代码。这是代码的示例:

report_uptime(){
cat << _EOF_
    <H2>System Uptime</H2>
    <PRE>$(uptime)</PRE>
    _EOF_
return
}

此代码不起作用,原因是因为在CAT之后我应该使用<<-而不是<<。有时<<有效。因此,我什么时候应该使用<<,什么时候应该使用<<-

这有效:

report_uptime(){
cat <<- _EOF_
    <H2>System Uptime</H2>
    <PRE>$(uptime)</PRE>
    _EOF_
return
}

这不是猫语法本身;这是您的外壳支持的重定向操作员之一:

https://www.gnu.org/software/bash/manual/bashref.html#here-documents

3.6.6这里文档

这种类型的重定向指示外壳从当前源读取输入,直到看到仅包含 word (没有尾随的空白)的线。然后,所有读取的行都被用作命令的标准输入。

此处的格式是:

<<[-]word
        here-document
delimiter

在Word上执行没有参数和可变扩展,命令替代,算术扩展或文件名扩展。如果引用了 word 中的任何字符,则定界符 word 上的报价删除的结果,此处的文档中的行不是扩展。如果 word 均未引用,则此处文档的所有行均受到参数扩展,命令替代和算术扩展,则忽略字符序列newline,必须使用''来引用字符'','$'和''。

如果重定向操作员为"&lt;&lt; - ’,则所有领先的选项卡字符均从输入线和包含 DeLimiter 的线中剥离。这允许在此处以自然方式缩进Shell脚本中的内容。

这不是严格地说cat实用程序的语法,而是外壳本身的语法,即bash

您正在使用的构造称为"此处文档"。这里的文档将其内容馈送到您在<<之前放置的任何命令的标准输入。

语法是这样:

command <<word
...
contents
...
END_TAG

这里的wordEND_TAG完全相同,或者可能是'END_TAG'-END_TAG-'END_TAG'

  • END_TAG没有单引号,此处文档的内容将经过替换。这意味着任何变量或简单地放置的"包含$的任何东西"都将被其值替换。

    $ tr 'a-z' 'A-Z' <<TR_END
    > This is my $HOME
    > TR_END
    THIS IS MY /USERS/KK
    

    >,一个大于标志和一个空间,就是所谓的二级提示。输入可以执行整个命令。它不是由我输入的。)

  • 'END_TAG'带有,此处的内容的内容将 not> not 进行替代。例如,这意味着,如果您在此处写入$HOME,它将被送入命令,而不是/home/myname(或任何主目录可能是)。

    $ tr 'a-z' 'A-Z' <<'TR_END'
    > This is my $HOME
    > TR_END
    THIS IS MY $HOME
    
  • 带有 领先的破折号( -,壳将在此处的每一行的开始时剥离所有选项卡(而不是空格)文档,包括末尾带有END_TAG的行。

    $ tr 'a-z' 'A-Z' <<-TR_END
    >       This line has a tab.
    > This one does not.
    > TR_END
    THIS LINE HAS A TAB.
    THIS ONE DOES NOT.
    
  • 没有领先的DASH ,Shell将 not 剥离选项卡。 END_TAG需要是终止此处文档的行上的第一件(也是唯一的)。

    $ tr 'a-z' 'A-Z' <<TR_END
    >       This line has a tab.
    > This one does not.
    > TR_END
        THIS LINE HAS A TAB.
    THIS ONE DOES NOT.
    

bash Shell还具有称为"这里串"的东西。它以类似的方式工作,但是您只将一条线喂入命令:

command <<<word

例如:

$ tr 'a-z' 'A-Z' <<<"hello world!"
HELLO WORLD!

通常,不应缩进末端标记。将其移至第1列。还请删除return语句,并且在Bash中对我有用。

相关内容

  • 没有找到相关文章

最新更新