当前位置: 首页 > 科技观察

Bash脚本中如何使用heredocument向文件写入数据

时间:2023-03-12 14:11:25 科技观察

heredocument(LCTT译注:heredocument又名heredoc)没什么特别的,只是一种I/O重定向的方式,它告诉bashshell从哪里开始当前源读取输入,直到读取到只有定界符的行。这对于为ftp、cat、echo、ssh和许多其他有用的Linux/Unix命令提供指令很有用。此功能适用于bash以及Bourne、Korn和POSIXshell。heredocument语法语法为:command<my_output_file.txtmesg1msg2msg3$varon$fooEOF或重定向并将其附加到名为my_output_file.txt的文件:command<>my_output_file.txtmesg1msg2msg3$varon$fooEOF示例以下脚本将所需内容写入名为/tmp/output的文件。txt文件:#!/bin/bashOUT=/tmp/output.txtcho"Startingmyscript..."echo"Doingsomething..."cat<$OUT备份状态$(date)Backingupfiles$HOMEand/etc/EOFecho"Startingbackupusingrsync..."您可以使用cat命令查看/tmp/output.txt文件:$cat/tmp/output.txt示例输出:Statusofbackupas在ThuNov1617:00:21IST2017备份文件/home/vivek和/etc/禁用路径名/参数/变量扩展、命令替换、算术扩展$HOME等变量和$(date)这样的命令在脚本中被解释为替换要禁用它,请使用带有单引号的'EOF',如下所示:#!/bin/bashOUT=/tmp/output.txtcho"Startingmyscript..."echo"Doingsomething..."#Noparameterandvariableexpansion、命令替换、算术扩展或路径名扩展在word上执行。#如果word的任何部分被引用,则分隔符是word去掉引号的结果,here-document中的行#不展开。所以EOF引用如下cat<<'EOF'>$OUTStatusofbackupason$(date)Backupupfiles$HOMEand/etc/EOFecho"Startingbackupusingrsync..."你可以使用cat命令查看/tmp/output.txt文件:$cat/tmp/output.txt示例输出:备份状态$(date)备份文件$HOME和/etc/关于tee命令的语法是:tee/tmp/filename</dev/nullline1line2line3$(cmd)$varon$fooEOF或者通过在单引号中引用EOF来禁用变量替换和命令替换:tee/tmp/filename<<'EOF'>/dev/nullline1line2line3$(cmd)$varon$fooEOF这是我更新的脚本:#!/bin/bashOUT=/tmp/output.txtcho"开始我的脚本..."echo"正在做某事..."tee$OUT</dev/null备份状态$(date)备份文件$HOME和/etc/EOFecho"开始备份使用rsync..."关于内存在这里文档的使用是我更新的脚本:#!/bin/bashOUT=/tmp/output.txt##inmemoryheredocs##thankshttps://twitter.com/freebsdfrauexec9<$OUTecho“正在使用rsync开始备份...”