Shell 中的 here 文档详解



我们知道平常在linux命令行的操作都可以放到文件里面,赋予可执行权限后,就可以将这文件变成一个shell脚本。但是如果我们跟有些程序交互时,shell脚本却帮不了我们太多。比如编辑一个文件和操作数据库。编辑一个文件一般用vi,进去后hjklaio的操作什么的,脚本怎么执行?mysql登陆输入mysql -u 用户 -p 密码后,就跟mysql进行一串交互,shell怎么执行?Here Document就可以派上用场了。

什么是Here Document

Here Document 是在Linux Shell 中的一种特殊的重定向方式,它的基本的形式如下

cmd << delimiter
  Here Document Content
delimiter

它的作用就是将两个 delimiter 之间的内容(Here Document Content 部分) 传递给cmd 作为输入参数。

比如在终端中输入cat << EOF ,系统会提示继续进行输入,输入多行信息再输入EOF,中间输入的信息将会显示在屏幕上。如下:

[email protected]:~$ cat << EOF
> First Line
> Second Line
> Third Line EOF
> EOF
First Line
Second Line
Third Line EOF

注: >这个符号是终端产生的提示输入信息的标识符

这里要注意几点

  • EOF 只是一个标识而已,可以替换成任意的合法字符
  • 作为结尾的delimiter一定要顶格写,前面不能有任何字符
  • 作为结尾的delimiter后面也不能有任何的字符(包括空格)
  • 作为起始的delimiter前后的空格会被省略掉

Here Document 不仅可以在终端上使用,在shell 文件中也可以使用,例如下面的here.sh 文件

cat << EOF > output.sh
echo "hello"
echo "world"
EOF

使用 sh here.sh 运行这个脚本文件,会得到output.sh 这个新文件,里面的内容如下

echo "hello"
echo "world"

Here Document的变形

delimiter 与变量

Here Document 的内容中,不仅可以包括普通的字符,还可以在里面使用变量,例如将上面的here.sh 改为

cat << EOF > output.sh
echo "This is output"
echo $1
EOF

使用sh here.sh HereDocument 运行脚本得到output.sh的内容

echo "This is output"
echo HereDocument

在这里 $1 被展开成为了脚本的参数 HereDocument

但是有时候不想展开这个变量怎么办呢,可以通过在起始的 delimiter的前后添加 " 来实现,例如将上面的here.sh 改为

cat << EOF > output.sh
echo "This is output"
echo $1
EOF

得到的output.sh 的内容为

echo "This is output"
echo $1

<< 变为 <<-

Here Document 还有一个用法就是将 ‘<<‘ 变为 ‘<<-‘。 使用 <<- 的唯一变化就是Here Document 的内容部分每行前面的 tab (制表符)将会被删除掉,这种用法是为了编写Here Document的时候可以将内容部分进行缩进,方便阅读代码。

Here Document的两个应用

  1. shell编辑文件。

shell编辑文件最常用的方法就是echo 字符串 >> 文件。但是要删除一行怎么办?Here Document就搞定了。在Here Document中使用vi是不行的。替代方法是使用ed命令。在命令行执行以下:

$ touch base.txt
$ ed base.txt
a
this is line1.
this is line2.
this is line3.
this is line4.
.
wq

先新建一个文件base.txt,然后ed这个文件,输入a表示最后追加,输入了四行文字。.表示结束输入。wq表示保存退出。

那我们再用ed命令,在shell脚本里面对这个文件再次进行操作。如下。

#!/bin/sh 

ed base.txt << !ED1_JEREMIAH!
3
d
i
this is line 3 new.
.
w
q
!ED1_JEREMIAH!

解释下:ed base.txt << !ED1_JEREMIAH! 表示编辑base.txt,用变量!ED1_JEREMIAH!标记,这里搞的变量复杂为了和shell中的其他变量进行区分。3表示到第3行,d表示删除,然后i表示本行增加,输入this is line 3 new。其他的同上述。最后用!ED1_JEREMIAH!结束。也就是说两个!ED1_JEREMIAH!之间的每一行都是类似与命令行输入到ed名中,进行交互。

执行的结果如下所示。

$ sh ed_file.sh && cat base.txt
60
this is line3.
65
this is line1.
this is line2.
this is line 3 new.
this is line4.

关于ed的操作和参数,可以查看linux帮助或去搜索相关的资料。

  1. shell控制数据库

假设执行下面的操作访问数据库。

$ mysql -u root
Welcome to the MySQL monitor.    Commands end with ; or \g.
Your MySQL connection id is 1257
Server version: 5.1.35-community MySQL Community Server (GPL) 

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement. 

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A 

mysql> select * from user;
mysql> exit
Bye

如果我们要用shell脚本访问,则可以编写如下的脚本。

#!/bin/sh 

mysql -u root << !ED2_JEREMIAH!
use mysql
select * from user;
exit
!ED2_JEREMIAH!

执行如下。

sh mysql_access.sh
时间: 2024-08-28 09:32:07

Shell 中的 here 文档详解的相关文章

Nginx配置文档详解

Nginx的配置文档详解,在这儿做个总结,以便以后使用的时间查看. 以下大部分自己整理,部分来自参考 #设置用户 #user  nobody; #启动进程数(一般和服务器的CPU相同) #可以使用 $ cat /proc/cpuinfo 查看内核数 worker_processes  2; #设置错误文件存放的路径 #error_log  logs/error.log; #error_log  logs/error.log  notice; #error_log  logs/error.log

redis.conf 配置文档详解

redis 配置文档详解. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411

Log4Net(二)之记录日志到文档详解

原创文章,转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/log4net-%E4%BA%8C-%E4%B9%8B%E8%AE%B0%E5%BD%95%E6%97%A5%E5%BF%97%E5%88%B0%E6%96%87%E6%A1%A3%E8%AF%A6%E8%A7%A3/ 前面一章.我们简单的介绍了log4net的功能,以及一个记录日志到文档的案例. 本节.将带领大家详细了解上节案例中各行代码的意思. 1

产品经理常用的三大文档详解

产品经理常用的三大文档,商业需求文档(Business Requirements Document).市场需求文档(Market Requirements Document).产品需求文档(Product Requirements Document) 商业需求文档(Business Requirements Document),产品介绍即是用一句话清晰定义你的产品:一句话明确表述产品有什么创新,解决了用户什么问题,填补了市场什么空白:一句话描述产品的市场规模和潜在远景:一句话来概括产品的竞争优势

命令帮助文档详解

一.简介 Linux提供了极为详细的帮助工具及文档,养成查帮助文档的良好习惯,可以大大减少需要记忆的东西并提高效率.man命令是Linux获取帮助文档的重要工具,它是manual的简写.通过man指令可以查看Linux中的指令帮助.配置文件帮助和编程帮助等信息. 二.whatis命令 whatis: 显示命令的简短描述: 查看命令所属章节(man -k COMMAND): 刚安装后不可立即使用: makewhatis(centos6)或mandb(centos7)制作数据库: whatis=ma

elastic search文档详解

在elastic search中文档(document)类似于关系型数据库里的记录(record),类型(type)类似于表(table),索引(index)类似于库(database). 文档一定有三个元数据 _index 文档在哪存放 _type 文档表示的对象类别 _id 文档唯一标识 _index可以理解为数据库,在elastic search中通常是将格式相同的数据存在同一_index下,_type即将取消,以后不同type建议分为不同_index,_id类似于数据库里的主键,你自己要

前端 HTML文档 详解

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> </body> </html> 1.声明HTML文档类型 <!DOCTYPE> 告诉浏览器使用什么样的html或者xhtml来解析ht

Storm文档详解

1.Storm基础概念 1.1.什么是storm? Apache Storm is a free and open source distributed realtime computation system. Storm是免费开源的分布式实时计算系统 实时和离线的区别: 1 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据.MapReduce批量计算数据.Hive批量计算数据.***任务调度 2 流式计算:数据实时产生.

值得收藏!my.cnf配置文档详解

MySql对于开发人员来说应该都比较熟悉,不管是小白还是老码农应该都能熟练使用.但是要说到的各种参数的配置,我敢说大部分人并不是很熟悉,当我们需要优化mysql,改变某项参数的时候.还是要到处在网上查找,有点不方便.今天就把我所知道的MySql的配置文件my.cnf做一个简单的说明吧,注意,我总结的mysql是Linux环境下的. 其实,如果你要做mysql性能优化,那么熟悉my.cnf 的相关参数是必不可少的.不然,很多时候就会出现:网上查资料说是调下某个参数性能能提升,实际你调完之后却没有任