Here Document

一、Here Document 概述

Here Document 是一种使用 I/O 重定向的方式,将命令列表提供给交互式程序或命令,比如 ftpcatread 命令。它是标准输入的一种替代品,可以帮助脚本开发人员避免使用临时文件来构建输入信息,直接就地生成一个文件并用作命令的标准输入。

1.1 基本语法格式

命令 <<标记
...
...
...
标记

特殊字符“<<”出现在标记和命令之前,将命令块的输出重定向到程序或命令的 stdin。标记的选择要确保不会出现在其他地方,以避免混淆;两个标记之间的内容被当做一个文件,并用作命令的标准输入。Here Document 也可以与非交互式程序和命令一起使用。

1.1.1 四点注意事项

  1. 标记可以使用任意的合法字符;
  2. 结尾的标记必须顶格写,前面不能有任何字符;
  3. 结尾的标记后面也不能有任何字符(包括空格);
  4. 开头的标记前后的空格会被省略。

1.1.2 示例

1.1.2.1 直接将输入从命令行输出
[root@localhost ~]# cat <<EOF
> hello world
> EOF
hello world
1.1.2.2 将输入保存到文件
[root@localhost ~]# cat > name <<EOF
> liuchun
> zhougang
> EOF

[root@localhost ~]# cat name
liuchun
zhougang
1.1.2.3 追加输入保存到文件
[root@localhost ~]# cat >> name <<EOF
> liufei
> EOF

[root@localhost ~]# cat name
liuchun
zhougang
liufei
1.1.2.4 创建 yum 源
[root@localhost ~]# cat > test.repo <<EOF
> [test]
> name=test
> baseurl=file:///mnt
> enabled=1
> gpgcheck=0
> EOF

另外写法1:

cat <<EOF > local.repo

另外写法2:

tee test1.txt <<EOF

1.2 Here Document 免交互

1.2.1 通过 read 命令接收输入并打印

输入值是两个 EOF 标记之间的部分,即“10”,这将作为变量 a 的值。

[root@localhost ~]# read a <<EOF
> 10
> EOF
[root@localhost ~]# echo $a
10

1.2.2 通过 passwd 给用户设置密码

1.2.2.1 给用户创建密码
[root@localhost ~]# passwd zhangsan <<EOF
> 123456
> 123456
> EOF
更改用户 zhangsan 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。

1.3 变量设定(支持变量替换)

1.3.1 在写入文件时要先将变量替换成实际值,再结合 cat 命令完成写入

1.3.1.1 案例1
[root@localhost ~]# aa=$(cat <<EOF
> $a
> EOF
> )
echo $aa
1.3.1.2 案例2 - 支持变量替换
#!/bin/bash
doc_file="KY17.txt"
i="KY17"
cat > $doc_file << EOF
Welcome to Class $i
EOF

this is $i classroom
cat KY17.txt

1.3.2 整体赋值给一个变量,然后通过 echo 命令将变量值打印出来

#!/bin/bash
ivar="Great! Beautyful!"
myvar=$(cat <<EOF
This is Line 1.
That are Sun,Moon and Stars.
$ivar
EOF
)
echo $myvar

1.4 格式控制

1.4.1 关闭变量替换的功能

关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换。

[root@localhost ~]# aa=$(cat <<'EOF'
20
$a
EOF
)
echo $aa
#!/bin/bash
i="ky17 class"
kgc=$(cat <<'EOF'
$i
EOF
)

echo $kgc

1.4.2 去掉每行之前的 TAB 字符

在第一行的标记前面加‘-’,表示要抑制各行首 TAB 的作用。

[root@localhost ~]# vim tab.sh
#!/bin/bash
cat <<EOF
        hello world
EOF

cat <<-EOF
        hello world
EOF

[root@localhost ~]# bash tab.sh
	hello world
hello world

1.5 多行注释

Bash 的默认注释是“#”,该注释方法只支持单行注释。在 Shell 脚本的工作中,“#”右侧的任何字符串都会被 Bash 忽略。Here Document 的引入解决了多行注释的问题。:’代表什么都不做的空命令。中间标记区域的内容不会被执行,会被 Bash 忽略掉,因此可达到批量注释的效果。

#!/bin/bash
a=kgc
: <<-EOF
the second comment.
test line.
echo $a
EOF
echo "exec string."
#!/bin/bash
FILE="nanjing zhongbo"
: <<-EOF
the second comment.
test line.
echo $FILE
EOF
echo "exec string."
n/bash
a=kgc
: <<-EOF
the second comment.
test line.
echo $a
EOF
echo "exec string."
#!/bin/bash
FILE="nanjing zhongbo"
: <<-EOF
the second comment.
test line.
echo $FILE
EOF
echo "exec string."
  • 25
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值