Cat 及更少的 EOF

Gha*_*san 1 command-line bash

我是 Linux 脚本的新手,我遇到了一些命令,但我不理解它们。

cat <<- _EOF_
command1
command2
command3
_EOF_
Run Code Online (Sandbox Code Playgroud)

还,

less <<- _EOF
command1
command2
command3
_EOF
Run Code Online (Sandbox Code Playgroud)

那么,谁能给我解释一下?

Hen*_*eck 6

在程序代码中,您必须标记哪些部分是命令,哪些部分是数据。典型的数据类型是字符串,意思是字符序列(字母、数字等)

有不同的方式来表示字符串文字。最常见的方法是引用字符串数据:

PATH="/home/user"
USER='joe'
Run Code Online (Sandbox Code Playgroud)

但是可能很难处理更长和/或包含换行符的字符串文字:

MESSAGE="This is a relatively long string which isn't represented very well as a typical quoted string.\nAnd there are linebreaks in it."
Run Code Online (Sandbox Code Playgroud)

对于这种情况,您可能希望能够说:“将以下内容视为字符串,直到我告诉您其他情况”。这正是here 文档所做的。这是表示字符串文字的另一种方式。您定义一个表示文本结束的标记,然后放置您的文本,然后是标记:

MESSAGE=<< EOF
Here be a long string.
With line breaks.
EOF
Run Code Online (Sandbox Code Playgroud)

您可以自由选择标记,但它通常类似于EOF(“文件结尾”)、eot(“文本结尾”)或类似内容。你也可以同样选择“ABC”

MESSAGE=<< ABC
Here be a long string.
With line breaks.
ABC
Run Code Online (Sandbox Code Playgroud)

“Here 文档”,也称为“heredocs”、“here-strings”或类似的东西,起源于 Unix shell bash,今天可以在许多编程语言中找到。

在 shell 中,它们的工作方式略有不同,因为它们表示的字符串不像表示文件那样多。所以,例如

cat << EOF
One
EOF
Run Code Online (Sandbox Code Playgroud)

相当于

cat data.txt # where data.txt contains 'One'
Run Code Online (Sandbox Code Playgroud)

<<-代替 `<<'的变体忽略了heredoc 数据中的前导空格,因此您可以通过识别heredoc 使您的代码更具可读性:

cat <<- EOF
  One
  Two
  Three
EOF
Run Code Online (Sandbox Code Playgroud)