“猫”EOF“如何在bash中工作?

我需要编写一个脚本来输入程序的多行输入( psql )。

经过一番搜索后,我发现了以下语法工作:

cat << EOF | psql ---params
BEGIN;

`pg_dump ----something`

update table .... statement ...;

END;
EOF

这正确地构造了多行字符串(从BEGIN;END;包括在内)并将其作为psql的输入。

但我不知道它是如何/为什么会起作用,有人可以解释一下吗?

我主要是指cat << EOF ,我知道>输出到文件, >>附加到文件, <从文件读取输入。

<<确切地做什么?

有没有一个手册页?


这称为heredoc格式,以将字符串提供到stdin。 有关更多详细信息,请参阅https://en.wikipedia.org/wiki/Here_document#Unix_shells。


man bash

这里的文件

这种类型的重定向指示shell从当前源读取输入,直到看到只包含单词(没有尾随空白)的行。

所有读到该点的行都被用作命令的标准输入。

这里的文件格式是:

          <<[-]word
                  here-document
          delimiter

执行参数扩展,命令替换,算术扩展或路径名扩展。 如果引用了单词中的任何字符,则分隔符是对单词的引用删除的结果,并且此文档中的行不会展开。 如果单词不加引号,那么这里的文档的所有行都要经过参数扩展,命令替换和算术扩展。 在后一种情况下,字符序列<newline>被忽略, 必须用于引用字符$`

如果重定向操作符是<<- ,则所有前导制表符都从输入行和包含分隔符的行中剥离。 这允许在这里 - shell脚本中的文档以自然的方式缩进。


cat <<EOF语法在使用Bash中的多行文本时非常有用,例如。 将多行字符串分配给shell变量,文件或管道时。

cat <<EOF语法在Bash中的用法示例:

1.将多行字符串分配给shell变量

$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)

$sql变量现在也包含换行符。 你可以使用echo -e "$sql"进行验证。

2.将多行字符串传递给Bash中的文件

$ cat <<EOF > print.sh
#!/bin/bash
echo $PWD
echo $PWD
EOF

print.sh文件现在包含:

#!/bin/bash
echo $PWD
echo /home/user

3.将多行字符串传递给Bash中的管道

$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF

b.txt文件包含barbaz线。 相同的输出被打印到stdout


在你的情况下,“EOF”被称为“Here标签”。 基本上<<Here告诉shell你将要输入一个多行字符串,直到“标记” Here 。 您可以根据需要命名该标签,通常是EOFSTOP

关于Here标签的一些规则:

  • 标签可以是任何字符串,大写或小写,尽管大多数人会按照惯例使用大写字母。
  • 如果该行中有其他单词,该标签将不被视为Here标签。 在这种情况下,它只会被视为字符串的一部分。 标签本身应该放在一个单独的行上,以作为标签。
  • 标签在该行中应该没有前导空格或尾随空格才能被视为标签。 否则,它将被视为字符串的一部分。
  • 例:

    $ cat >> test <<HERE
    > Hello world HERE <-- Not by itself on a separate line -> not considered end of string
    > This is a test
    >  HERE <-- Leading space, so not considered end of string
    > and a new line
    > HERE <-- Now we have the end of the string
    
    链接地址: http://www.djcxy.com/p/56735.html

    上一篇: How does "cat << EOF" work in bash?

    下一篇: How do you normalize a file path in Bash?