如何在bash编程中使用Here文档

39 阅读3分钟

一个可以被重定向到命令脚本或交互式程序的代码块或文本被称为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
startWelcometoLinuxBlogSite.start Welcome to Linux Blog Site. 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文件。

bashheredoc4.shbashheredoc4.sh 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=priceprice-price*10/100))
echo "bookName"echo"bookName" echo "authorName"
echo "edition,edition,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 "yr是闰年。"elif\[yr是闰年。" elif \[((yrecho"yr%100)) \-eq 0 \]; then echo "yris not a Leap year."
elif [((((yr%4)) -eq 0 ]; then
echo "yr是一个闰年。"elseecho"yr是一个闰年。" else echo "yr不是一个闰年。"
fi

输出。

执行上述脚本后会出现以下输出。下面的输出显示,2008年是闰年,2021年不是闰年。

结论。

在本教程中,通过使用多个例子展示了heredoc文件的各种用途。它可以用于不同类型的shell命令和在bash脚本中添加多行注释。在练习了本教程的例子后,bash用户将清楚heredoc的用途。