繁体   English   中英

在Bash中输入heredoc的语法

[英]Input syntax for heredoc in Bash

我正在通过Ubuntu 16中的终端学习Unix bash。我正在编写一个简单的脚本,所以我可以练习为Unix编写代码。 以下是代码示例:

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

这段代码不起作用,原因是因为我应该使用<<-而不是<< 有时<<工作。 那么我什么时候应该使用<<什么时候我应该使用<<-

这有效:

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

这本身不是cat语法; 它是shell支持的重定向运算符之一:

https://www.gnu.org/software/bash/manual/bashref.html#Here-Documents

3.6.6这里的文件

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

here-documents的格式是:

 <<[-]word here-document delimiter 

不对字执行参数和变量扩展,命令替换,算术扩展或文件名扩展。 如果引用单词中的任何字符,则分隔符单词上的引号删除的结果,并且不会展开here-document中的行。 如果word不加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展,字符序列\\newline被忽略,'\\'必须用于引用字符'\\','$ '和'''。

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

这并不是严格来说cat实用程序的语法,而是shell本身的语法,即bash的语法。

您正在使用的构造称为“here-document”。 here-文档将其内容提供给您在<<之前放置的任何命令的标准输入。

语法是这样的:

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

word在这里或者是完全一样的END_TAG ,也可能是'END_TAG'-END_TAG ,或-'END_TAG'

  • END_TAG如果没有单引号 ,here-document的内容将被替换。 这意味着任何变量,或简单地说,“包含$任何东西”都将被其值替换。

     $ tr 'az' 'AZ' <<TR_END > This is my $HOME > TR_END THIS IS MY /USERS/KK 

    > ,一个大于号和一个空格,就是所谓的辅助提示 。我得到了,因为我直接在shell中输入它,并且它需要更多行输入才能执行整个命令。不是我输入的。)

  • 'END_TAG'使用单引号 ,here-document的内容不会被替换。 这意味着,例如,如果您在here-document中编写$HOME ,它将被输入命令,就像/home/myname (或者您的主目录可能是什么)。

     $ tr 'az' 'AZ' <<'TR_END' > This is my $HOME > TR_END THIS IS MY $HOME 
  • 使用前导短划线( - ,shell将在here-document的每一行的开头处去除所有选项卡(但不是空格),包括末尾带有END_TAG的行。

     $ tr 'az' 'AZ' <<-TR_END > This line has a tab. > This one does not. > TR_END THIS LINE HAS A TAB. THIS ONE DOES NOT. 
  • 没有前导破折号 ,外壳不会剥离标签。 END_TAG需要是结束here-document的第一行(也是唯一的)。

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

bash shell也有一个名为“here-strings”的东西。 它的工作方式类似,但您只需在命令中输入一行:

command <<<word

例如:

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

通常,结束标记不应缩进。 将其移至第1列。同时删除return语句,它在bash中适用于我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM