1、Here Document免交互
概述:
- Here Document使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
- 是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个"文件"并用作"命令"的标准输入。
- Here Document 也可 以与非交互式程序和命令一起使用。
格式:
命令 <<标记 ....... 内容 #标记之间是传入内容 ....... 标记
注意事项:
- 标记可以使用任意合法字符(通常为EOF)
- 结尾的标记一定要顶格写,前面不能有任何字符结尾的
- 标记后面也不能有任何字符(包括空格)
- 开头标记前后的空格会被省略掉
补充:a)免交互方式实现对行数的统计,将要统计的内容置于标记"EOF"之间,直接将内容传给 wc -1 来统计
wc -l <<EOF > 123 > 345 > 567 > EOF 3
b)通过read命令接收输入并打印,输入值是两个EOF 标记之间的部分,作为变量i的值
read i <<EOF >Hi >EOF echo $i
c)通过passwd给用户设置密码
passwd lisi <<EOF >abc1234 >abc1234 #这两行是输入的密码和确认密码 >EOF
支持变量替换:
在写入文件时会先将变量替换成实际值,再结合cat 命令完成写入
#!/bin/bash file="EOF1.txt" i="school" cat > $file <<EOF I am going to $i EOF cat EOF1.txt
整体赋值给变量,然后通过echo命令将变量值打印出来
#! /bin/bash var="Great! I am going to school!" myvar=$(cat <<EOF This is Line 1. Today is Monday. $var EOF ) echo "$myvar"
关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换
#!/bin/bash var="Great! I am going to school!" myvar=$(cat <<'EOF' #对标记加单引号,即可关闭变量替换 This is Line 1. Today is Monday . $var EOF ) echo $myvar
去掉每行之前的TAB字符
#!/bin/bash var="Great! I am going to school!" myvar-s (cat <<-'EOF' #在标记前加“-”,即可抑制各行首TAB This is Line 1. Today is Monday. $var EOF ) echo $myvar
多行注释:
- Bash的默认注释是“#”,该注释方法只支持单行注释: Here Document 的引入解决了多行注释的问题
- “:"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果
#!/bin/bash var="Great! I am going to school!" : <<-EOF #多行注释,“:”开头的Here Document标记内容不会被执行 This is Line 1. Today is Monday. $var EOF echo "abcd"