here 文档 (LCTT 译注:here 文档又称作 heredoc )不是什么特殊的东西,只是一种 I/O 重定向方式,它告诉 bash shell 从当前源读取输入,直到读取到只有分隔符的行。
这对于向 ftp、cat、echo、ssh 和许多其他有用的 Linux/Unix 命令提供指令很有用。 此功能适用于 bash 也适用于 Bourne、Korn、POSIX 这三种 shell。
here 文档语法
语法是:
command <<EOF
cmd1
cmd2 arg1
EOF
或者允许 shell 脚本中的 here 文档使用 EOF<<-
以自然的方式缩进:
command <<-EOF
msg1
msg2
$var on line
EOF
或者
command <<'EOF'
cmd1
cmd2 arg1
$var won't expand as parameter substitution turned off
by single quoting
EOF
或者 重定向并将其覆盖 到名为 my_output_file.txt
的文件中:
command <<EOF > my_output_file.txt
mesg1
msg2
msg3
$var on $foo
EOF
或重定向并将其追加到名为 my_output_file.txt
的文件中:
command <<EOF >> my_output_file.txt
mesg1
msg2
msg3
$var on $foo
EOF
示例
以下脚本将所需内容写入名为 /tmp/output.txt
的文件中:
“`
!/bin/bash
OUT=/tmp/output.txt
echo “Starting my script…”
echo “Doing something…”
cat < echo “Starting backup using rsync…” 你可以使用cat命令查看/tmp/output.txt文件: 示例输出: 像 “` OUT=/tmp/output.txt echo “Starting my script…” cat <<‘EOF’ >$OUT echo “Starting backup using rsync…” 你可以使用 cat 命令查看 示例输出: “` “` 语法是: 或者通过在单引号中引用 这是我更新的脚本: “` OUT=/tmp/output.txt echo “Starting my script…” tee $OUT < echo “Starting backup using rsync…” 这是我更新的脚本: “` OUT=/tmp/output.txt exec 9< echo “Starting my script…” cat <&9 >$OUT echo “Starting backup using rsync…” via: https://www.cyberciti.biz/faq/using-heredoc-rediection-in-bash-shell-script-to-write-to-file/ 作者:Vivek Gite 译者:Flowsnow 校对:wxy 主题测试文章,只做测试使用。发布者:eason,转转请注明出处:https://aicodev.cn/2018/11/12/bash-%e8%84%9a%e6%9c%ac%e4%b8%ad%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8-here-%e6%96%87%e6%a1%a3%e5%b0%86%e6%95%b0%e6%8d%ae%e5%86%99%e5%85%a5%e6%96%87%e4%bb%b6/
“`
$ cat /tmp/output.txt
Status of backup as on Thu Nov 16 17:00:21 IST 2017
Backing up files /home/vivek and /etc/禁用路径名/参数/变量扩展、命令替换、算术扩展
$HOME
这类变量和像 $(date)
这类命令在脚本中会被解释为替换。 要禁用它,请使用带有 'EOF'
这样带有单引号的形式,如下所示:!/bin/bash
echo “Doing something…”No parameter and variable expansion, command substitution, arithmetic expansion, or pathname expansion is performed on word.
If any part of word is quoted, the delimiter is the result of quote removal on word, and the lines in the here-document
are not expanded. So EOF is quoted as follows
Status of backup as on $(date)
Backing up files $HOME and /etc/
EOF
“`/tmp/output.txt
文件:
$ cat /tmp/output.txt
Status of backup as on $(date)
Backing up files $HOME and /etc/关于 tee 命令的使用
tee /tmp/filename <<EOF >/dev/null
line 1
line 2
line 3
$(cmd)
$var on $foo
EOFEOF
来禁用变量替换和命令替换:
tee /tmp/filename <<'EOF' >/dev/null
line 1
line 2
line 3
$(cmd)
$var on $foo
EOF!/bin/bash
echo “Doing something…”
“`关于内存 here 文档的使用
!/bin/bash
in memory here docs
thanks https://twitter.com/freebsdfrau
continue
echo “Doing something…”do it
“`