一、Here Document 概述
Here Document 是一种使用 I/O 重定向的方式,将命令列表提供给交互式程序或命令,比如 ftp
、cat
或 read
命令。它是标准输入的一种替代品,可以帮助脚本开发人员避免使用临时文件来构建输入信息,直接就地生成一个文件并用作命令的标准输入。
1.1 基本语法格式
命令 <<标记
...
...
...
标记
特殊字符“<<”出现在标记和命令之前,将命令块的输出重定向到程序或命令的 stdin
。标记的选择要确保不会出现在其他地方,以避免混淆;两个标记之间的内容被当做一个文件,并用作命令的标准输入。Here Document 也可以与非交互式程序和命令一起使用。
1.1.1 四点注意事项
- 标记可以使用任意的合法字符;
- 结尾的标记必须顶格写,前面不能有任何字符;
- 结尾的标记后面也不能有任何字符(包括空格);
- 开头的标记前后的空格会被省略。
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."