linux
  • 说明
  • 菜鸟教程
  • debian 9升级到debian 10
  • Linux 命令
  • ssh
    • debian设置root登录ssh权限
    • ssh登录方式切换[密码/密钥]
    • 设置ssh默认登录root账户
  • LINUX
    • Tmux使用手册
    • debian防火墙操作
    • vnstat 统计服务器网卡流量
    • systemctl教程
    • 手动开启BBR
    • 解决端口占用问题
    • cron计划任务
  • gd&od
    • gd & od 转存政策
    • od E5申请及API开启教程
    • gd API操作教程
    • rclone/fclone安装教程
    • gd to od
    • Rclone 进阶使用教程 - 常用命令参数详解
    • 改版后的新版GCP界面通过AutoRclone批量生成SA文件的究极保姆级教程
  • shell开发
    • EOF用法及案例
    • 正则表达式在重命名中的应用
由 GitBook 提供支持
在本页
  • 基本用法
  • 1 向文件写入内容(覆盖/追加)
  • 覆盖写入
  • 追加写入
  • 2 命令显示
  • 3 命令交互输入
  • 4 案例一

这有帮助吗?

  1. shell开发

EOF用法及案例

在平时的运维工作中,我们经常会碰到这样一个场景: 执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了! 这个时候,就可以使用EOF结合cat命令进行行内容的追加了。

基本用法

下面就对EOF的用法进行梳理:

EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF. EOF一般会配合cat能够多行文本输出. 其用法如下:

<<EOF //开始 
.... 
EOF //结束

注:第一个终止符可以有缩进,第2个终止符不得有缩进

通过cat配合重定向能够生成文件并追加操作,在它之前先熟悉几个特殊符号:

  • < :输入重定向

  • > :输出重定向

  • >> :输出重定向,进行追加,不会覆盖之前内容

  • << :标准输入来自命令行的一对分隔号的中间内容

1 向文件写入内容(覆盖/追加)

将一个文件的内容覆盖输出到另一个文件中:cat fileA > fileB

将一个文件的内容追加输出到另一个文件中:cat fileA >> fileB

那么,cat > fileA << EOF会发生什么呢

覆盖写入

cat << EOF >test.sh #//或者cat > test.sh << EOF
> 123123123
> 3452354345
> asdfasdfs
> EOF
cat test.sh
显示如下:
123123123
3452354345
asdfasdfs

追加写入

cat << EOF >>test.sh #或者 cat >> test.sh << EOF
> 7777
> 8888
> EOF
cat test.sh
显示如下
123123123
3452354345
asdfasdfs
7777
8888

2 命令显示

先举一个简单的例子:

cat << EOF
Hello
EOF

将显示以下内容:
Hello

思考: 我们可以从cat命令的说明中知道,cat的操作对象是文件,但是例1中cat的操作对象不是文件,而是用户输入。

那么我们可以这样理解例子:先在文件file中输入“Hello”,再用cat file输出其中的内容。 也就是说我们可以用一个文件来替代"<< EOF EOF"。 反过来说,如果操作命令中的文件是输入对象,也可以用"<< EOF EOF"来替代的。

为什么cat、touch命令可以和EOF配合使用,而echo、print不行呢?

3 命令交互输入

假设有如下的磁盘分区脚本:

sfdisk -uM /dev/sda << EOF
,2048,b
,1024,83
,1024,83
EOF

根据之前的思考,将"<< EOF"和"EOF"之间的内容保存到文件part中,然后将脚本修改为: sfdisk -uM /dev/sda < part 经测试,修改后的方式可以达到同样的分区结果。

综上所述,“<< EOF EOF”的作用是在命令执行过程中用户自定义输入,它类似于起到一个临时文件的作用,只是比使用文件更方便灵活。

4 案例一

分享一个自动新建分区并挂载的脚本:

#!/bin/bash
fdisk  /dev/sdb  <<EOF
n
p
1
 
 
wq
EOF
 
/sbin/mkfs .ext4  /dev/sdb1  &&   /bin/mkdir  -p  /data  &&  /bin/mount  /dev/sdb1  /data
echo  'LABEL=data_disk /data ext4 defaults 0 2'  >>  /etc/fstab
上一页改版后的新版GCP界面通过AutoRclone批量生成SA文件的究极保姆级教程下一页正则表达式在重命名中的应用

最后更新于3年前

这有帮助吗?