一、Here Document 概述
使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
HereDocument是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。
基本语法格式:
命令 <<标记
...
...
...
标记
特殊字符“<<”在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的 stdin。标记的选择要确保不会出现在其他地方,避免出现混淆;两个标记之间的内容被当做是一个文件并用作“命令”的标准输入。另外 Here Document 也可以与非交互式程序和命令一起使用。
四点注意事项:
- 标记可以使用任意的合法字符;
- 结尾的标记一定要顶格写,前面不能有任何字符;
- 结尾的标记后面也不能有任何字符(包括空格);
- 开头的标记前后的空格会被省略
[root@localhost ~]# cat <<EOF //直接把输入的从命令行输出
> hello world
> EOF
hello world
[root@localhost ~]# cat > name <<EOF //输入保存到文件
> li
> wang
> EOF
[root@localhost ~]# cat name
li
wang
[root@localhost ~]# cat <<EOF >> name //追加输入保存到文件
> zhang
> EOF
[root@localhost ~]# cat name
li
wang
zhang
1.1、案例
1.1.1、案例1:创建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.1.2、read变量免交互
通过 read 命令接收输入并打印,输入值是两个 EOF 标记之间的部分,也就是“10”,这将作为变量 a 的值
[root@localhost ~]# read a <<EOF
> 10
> EOF
[root@localhost ~]# echo $a
10
1.1.3、通过 passwd 给用户设置密码
案例1:给用户创建密码
[root@localhost ~]# passwd yycc <<EOF
> 123456
> 123456
> EOF
更改用户 yycc 的密码 。(需要有这个用户)
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
1.1.4、变量设定(支持变量替换)
在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入
这个也就是变量替换
[root@localhost ~]# aa=$(cat <<EOF //变量替换
> $a
> EOF
> )
echo $aa
(有问题)写在shell中示例
#!/bin/bash
doc="hh.txt"
ii="yc66"
cat > $doc<<EOF
hi $ii
EOF
cat hh.txt
整体赋值给一个变量,然后通过 echo 命令将变量值打印出来。
#/bin/bash
ivar="very beautyful"
myvar=$(cat <<EOF
$ivar
EOF
)
echo $myvar
1.1.5、格式控制
关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换关闭变量替换
就是关闭行内的变量
#!/bin/bash
i="tkl"
kk=$(cat <<'EOF'
$i
EOF
)
echo $kk
1.1.6、去掉每行之前的 TAB 字符
在第一行的标记前面加‘-’,这个表示要抑制各行首 TAB 的作用。
#!/bin/bash
cat <<EOF
hello world
EOF
cat <<-EOF
hello world
EOF
1.1.7、多行注释
Bash 的默认注释是“#”,该注释方法只支持单行注释,在 Shell 脚本的工作中,“#”右侧的任何字符串,bash 都会将其忽略。
Here Document 的引入解决了多行注释的问题,:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果。
#多行注释 以 :开头的Here Document标记内容不会被执行(正常是cat)
#!/bin/bash
a=hhh
: <<-EOF
the nh .
echo $a
EOF
echo "djh"
未完待续