我目前正在通过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
这里的word
与END_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中对我有用。