一个可以被重定向到命令脚本或交互式程序的代码块或文本被称为here文档或HereDoc。不同类型的脚本语言,如bash、sh、csh、ksh等,可以直接使用Here-document接受文本输入,而不使用任何文本文件。因此,当编码者需要较少的文本数据时,在同一个文件中使用代码和数据是更好的选择,在脚本中使用Here-document就可以轻松做到。如果没有脚本语言,here-document也可以用在各种高级语言中,如php、perl等。如何在bash脚本中使用here-document,将在本教程中展示。
要在任何bash脚本中使用here-document,你必须在任何bash命令后使用符号<<,并在文本末尾使用相同的定界标识符来关闭HereDoc。编写HereDoc的语法如下所示。
命令<<HeredocDelimiter
.. .
.. .
HeredocDelimiter
例子-1:使用简单的heredoc文本
当heredoc被用在任何脚本中时,有必要保持起始和结束定界符的名称相同。假设命令是`cat`,heredoc的定界符是ADDTEXT。 创建一个名为heredoc1.bash的bash脚本文件,代码如下,以检查heredoc的简单使用。
#!/bin/bash
cat <<ADDTEXT
这个文本是
由Here Document
ADDTEXT添加的。
运行下面的命令来执行该脚本。
$ bashheredoc1.bash
输出。
执行该脚本后会出现以下输出。
示例-2:使用带有'-'符号的heredoc
HereDoc使用**'-'符号来抑制每行heredoc文本中的任何制表符空间。在下面的例子中,每行的开头都加上了制表符** 空间,并且在起始分隔符之前使用了**'-'符号。当脚本执行时,每行的开头都省略了所有的制表符空间,但它对正常的空间没有产生任何影响。创建一个名为heredoc2.bash的bash文件,用以下脚本来测试'-'**的功能。
#!/bin/bash
cat <<-ADDTEXT2
第1行:这里Document有助于打印短文
第2行:这里Document可以用来格式化文本
第3行:这里Document可以打印文本中的变量
第4行:这里Document用'-'可以删除行中的制表符空间
ADDTEXT2
运行下面的命令来执行该脚本。
$ bashheredoc2.sh
输出。
执行该脚本后会出现以下输出。选项卡 空间已经从heredoc的内容中移除。
例3:在heredoc文本中使用变量
创建一个新的bash脚本,代码如下。这里,声明了两个名为start和end的变量。这些变量是在heredoc文本中使用的。如果你在heredoc的起始分隔符处使用引号,那么变量的值就不会在控制台中打印出来。
#!/bin/bash
start="Hello everybody"
end="Good Luck"
cat <<ADDTEXT3
end
ADDTEXT3
运行下面的命令来执行该脚本。
$ bashheredoc3.sh
输出。
执行该脚本后会出现以下输出。该输出显示了heredoc的内容和变量的值。
例4:使用HerDoc创建一个新的bash文件
在前面的例子中,我们展示了如何在任何bash脚本中使用heredoc。 你也可以使用heredoc创建一个新的bash文件,在本教程的下一部分中展示。用以下代码创建一个名为heredoc4.sh的新bash文件。这里,声明了NewFile变量来设置新的bash脚本的文件名,该脚本将在heredoc4.sh文件执行后被创建。 在执行之后,一个名为output.sh的新bash文件将被创建。
#!/bin/bash
NewFile=output.sh
(
cat < $NewFile
运行下面的命令来测试上述脚本。第一条命令将执行主脚本文件。第二条命令将显示新创建文件的内容。第三条命令将运行新创建的bash文件。
catoutput.sh
$bashoutput.sh
输出。
执行脚本后会出现以下输出。
例5:用heredoc使用函数
你可以通过heredoc内容将输入值传递给bash脚本的任何函数的变量。创建另一个新的名为heredoc5.sh的bash文件来测试函数如何与heredoc一起使用。在该文件中添加以下代码。在脚本中声明一个名为BookInfo 的函数,它将从heredoc文本中获取数据。在这个函数中声明了六个变量,分别是ISBN、bookName、authorName、版本、出版物和价格。为了正确地设置这些变量的值,你必须根据函数中声明的变量来保持heredoc部分的值的顺序。设置完函数变量中的数据后,价格值按10%的折扣计算,并在控制台中打印所有变量的值。
#!/bin/bash
#声明将从这里获取数据的函数
BookInfo()
{
readISBN
readbookName
readauthorName
readedition
readpublication
readprice
}
# Declare here document part to send data into the function
BookInfo<<ADDTEXT5
ISBN-78633567809
Easy Laravel 5
W. Jason Gilmore 9th Edition.Jason Gilmore
第9版
Learpub
100
ADDTEXT5
# 在计算出10%折扣的价格值后,打印出函数变量的值
((price=price*10/100))
echo "authorName"
echo "publication"
echo "price
运行以下命令来执行该脚本。
$ heredoc5.bash
输出。
在这里,价格变量的值已经被设置为100。在对价格值设置了10%的折扣后,该值已被设置为90。执行后,终端会出现以下输出。
例6:在heredoc中执行命令
创建一个名为heredoc6.bash的bash文件,用以下脚本执行 "date"**、"pwd "**和 "whoami "命令和 "sudo "命令。
#!/bin/bash
#用`sudo`命令在heredoc内容中添加三个命令
sudo -s <<COMMAND
date
pwd
whoami
COMMAND
输出。
执行上述脚本后会出现以下输出。三个命令的输出已经打印在输出中。
例-7: 使用heredoc将多行代码写进一个文件
创建一个名为heredoc6.bash的bash文件,用下面的脚本在名为temp.txt的文本文件中添加多行,并打印文件的内容。执行该代码后,将有三行被添加到文本文件中。
#!/bin/bash
:'这个脚本将把多行
写入一个文本文件
'
# 使用heredoc将多行写入文件
cat > 'temp.txt' <<FileContent
Bash是一种流行的脚本语言。
通过使用bash脚本可以轻松完成许多管理任务
。
FileContent
# 打印文件的内容
cattemp.txt
输出。
在执行完上述脚本后会出现以下输出。该输出显示在temp.txt文件中增加了三行。
例子-8:使用heredoc与管道来搜索和替换内容
heredoc的输入也可以用管道来实现。用下面的脚本创建一个bash文件,从heredoc内容中搜索和替换一个特定的字符。第一个heredoc将打印原始文本,第二个heredoc将打印替换后的文本。这里使用了`sed`命令,将所有字符'a'的实例替换为'A'。
#!/bin/bash
echo "The original content is:"
cat <<'ORIGINAL'
Bash是一种shell脚本语言
HTML是一种标记语言
Javascript是一种客户端脚本语言
ORIGINAL
# 添加一个换行符
echo
echo "用'A'替换'a'之后的内容。"
cat <<'REPLACE' | sed 's/a/A/g'
Bash是一种外壳脚本语言
HTML是一种标记语言
Javascript是一种客户端脚本语言
REPLACE
输出。
执行上述脚本后会出现以下输出。在输出中,所有的'a'都被'A'所取代。
例九:使用heredoc来注释行块
heredoc的一个重要用途是对bash脚本的多行进行注释。用下面的脚本创建一个bash文件来查找某年是否是闰年。该脚本的目的已经用heredoc的多行注释描述出来了。
#!/bin/bash
<<multiline_comment
这个脚本用来找出
某年是否是闰年
闰年
multiline_comment
# 从用户那里获取4位数的年份值
echo -n "输入4位数的年份值。"
readyr
# 检查所取年值是否为闰年
if [yr%400)) -eq 0 ]; then
echo "((yris not a Leap year."
elif [yr%4)) -eq 0 ]; then
echo "yr不是一个闰年。"
fi
输出。
执行上述脚本后会出现以下输出。下面的输出显示,2008年是闰年,2021年不是闰年。
结论。
在本教程中,通过使用多个例子展示了heredoc文件的各种用途。它可以用于不同类型的shell命令和在bash脚本中添加多行注释。在练习了本教程的例子后,bash用户将清楚heredoc的用途。