协慌网

登录 贡献 社区

如何在 Bash 脚本中将 Heredoc 写入文件?

如何在 Bash 脚本中将 Here 文档写入文件?

答案

阅读《高级 Bash 脚本指南》第 19 章

这是一个将内容写入/tmp/yourfilehere

cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
        This line is indented.
EOF

请注意,最后的'EOF'( LimitString )字词前不应有任何空格,因为这意味着LimitString将不会被识别。

在 shell 脚本中,您可能希望使用缩进来使代码可读,但是这会对在 here 文档中缩进文本产生不良影响。在这种情况下,请使用<<- (后接破折号)来禁用前导制表符(请注意,要进行测试,您需要将前导空格替换为制表符,因为我无法在此处打印实际的制表符。)

#!/usr/bin/env bash

if true ; then
    cat <<- EOF > /tmp/yourfilehere
    The leading tab is ignored.
    EOF
fi

如果您不想解释文本中的变量,请使用单引号:

cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF

通过命令管道传递 heredoc:

cat <<'EOF' |  sed 's/a/b/'
foo
bar
baz
EOF

输出:

foo
bbr
bbz

sudo将 Heredoc 写入文件:

cat <<'EOF' |  sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF

代替使用cat和 I / O 重定向,可以使用tee代替:

tee newfile <<EOF
line 1
line 2
line 3
EOF

它更加简洁,而且与重定向运算符不同,如果您需要使用 root 权限写入文件, sudo

笔记:

问题(如何在 bash 脚本中将 here 文档(aka heredoc )写入文件?)具有(至少)3 个主要的独立维度或子问题:

  1. 您要覆盖现有文件,追加到现有文件还是写入新文件?
  2. 您的用户或其他用户(例如root )是否拥有该文件?
  3. 您是要直接编写 Heredoc 的内容,还是要让 Bash 解释 Heredoc 内部的变量引用?

(还有其他我认为不重要的维度 / 子问题。请考虑编辑此答案以添加它们!)以下是上面列出的问题的维度的一些更重要的组合,带有各种不同的定界标识符 - 没什么EOF是神圣的,只需确保您用作定界标识符的字符串不会在 Heredoc 中出现:

  1. 要覆盖您拥有的现有文件(或写入新文件),请在 heredoc 中替换变量引用:

    cat << EOF > /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, with the variable contents substituted.
    EOF
  2. 要附加您拥有的现有文件(或写入新文件),请在 heredoc 中替换变量引用:

    cat << FOE >> /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, with the variable contents substituted.
    FOE
  3. 要使用 heredoc 的文字内容覆盖您拥有的现有文件(或写入新文件):

    cat << 'END_OF_FILE' > /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, without the variable contents substituted.
    END_OF_FILE
  4. 要附加您拥有的现有文件(或写入新文件)以及 heredoc 的文字内容,请执行以下操作:

    cat << 'eof' >> /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, without the variable contents substituted.
    eof
  5. 要覆盖 root 拥有的现有文件(或写入新文件),请在 heredoc 中替换变量引用:

    cat << until_it_ends | sudo tee /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, with the variable contents substituted.
    until_it_ends
  6. 要附加用户 = foo 拥有的现有文件(或写入新文件),并带有 heredoc 的文字内容,请执行以下操作:

    cat << 'Screw_you_Foo' | sudo -u foo tee -a /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, without the variable contents substituted.
    Screw_you_Foo