Bash 脚本中如何使用 here 文档将数据写入文件

here 文档不是什么特殊的东西,只是一种 I/O 重定向方式,它告诉 bash shell 从当前源读取输入,直到读取到只有分隔符的行。

here 文档 here document (LCTT 译注:here 文档又称作 heredoc )不是什么特殊的东西,只是一种 I/O 重定向方式,它告诉 bash shell 从当前源读取输入,直到读取到只有分隔符的行。

redirect output of here document to a text file

这对于向 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文件:


$ 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

OUT=/tmp/output.txt

echo “Starting my script…”
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

cat <<‘EOF’ >$OUT
Status of backup as on $(date)
Backing up files $HOME and /etc/
EOF

echo “Starting backup using rsync…”
“`

你可以使用 cat 命令查看 /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
EOF

或者通过在单引号中引用 EOF 来禁用变量替换和命令替换:


tee /tmp/filename <<'EOF' >/dev/null
line 1
line 2
line 3
$(cmd)
$var on $foo
EOF

这是我更新的脚本:

“`

!/bin/bash

OUT=/tmp/output.txt

echo “Starting my script…”
echo “Doing something…”

tee $OUT <

echo “Starting backup using rsync…”
“`

关于内存 here 文档的使用

这是我更新的脚本:

“`

!/bin/bash

OUT=/tmp/output.txt

in memory here docs

thanks https://twitter.com/freebsdfrau

exec 9<

continue

echo “Starting my script…”
echo “Doing something…”

do it

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

本文由 LCTT 原创编译,Linux中国 荣誉推出

主题测试文章,只做测试使用。发布者: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/

Like (0)
eason的头像eason
Previous 2018年11月12日
Next 2018年11月13日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信