我们经常会碰到这样一个场景:
执行脚本的时候,需要往一个文件里自动输入N行内容。
如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,
单纯用echo追加的方式就显得愚蠢之极。
这个时候,就可以使用EOF结合cat命令进行行内容的追加了!
cat和EOF简介
cat用于显示文本文件内容,全部输出
EOF“end of file”,表示文本结束符
结合这两个标识,即可避免使用多行echo命令的方式,并实现多行输出的结果。
如果不是在脚本中,我们可以用Ctrl-D输出EOF的标识
# cat > test.txt
# cat >> test.txt
111
222
333
Ctrl-D
####################################
EOF是END Of File的缩写,表示自定义终止符。
既然自定义,那么EOF就不是固定的,可以随意设置别名,在Linux按
Ctrl-D就代表EOF。
EOF一般会配合cat能够多行文本输出,通过cat配合重定向能够生成文件并追加操作。
在它之前先熟悉几个特殊符号:
< 输入重定向
> 输出重定向
>> 输出重定向,进行追加,不会覆盖之前内容
<< 标准输入来自命令行的一对分隔号的中间内容
其用法如下:
<
....
EOF //结束
还可以自定义,比如自定义:
<
....
ABC //结束
# cat << EOF > test.txt
# cat << EOF >> test.txt
# cat >
test.txt << EOF
# cat >> test.txt << EOF
# cat << EOF >test.txt
> Hello!
> This is a test file!
> Test for cat and EOF!
> EOF
看
执行结果:
# cat test.txt
Hello!
This is a test file!
Test for cat and EOF!
#######################################
cat <
两个都是获取stdin,并在EOF处结束stdin,输出stdout。
但是 <<- 是什么意思呢?
先来看man中的说明:
If the redirection operator is <<-, then all leading tab characters are stripped from input lines and the line containing delimiter.
翻译过来的意思就是:
如果重定向的操作符是<<-,那么分界符(EOF)所在行的开头部分的制表符(Tab)都将被去除。
这可以解决由于脚本中的自然缩进产生的制表符。
通俗一点的解释:
在我们使用cat <
EOF必须顶行写,前面不能用制表符或者空格。
比如,下面的语句就不会出错:
# cat <
> Hello,world!
> EOF
Hello,world!
##################
如果结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入。
而<<-就是为了解决这一问题:
# cat <<-EOF
>Hello,world!
> EOF
Hello,world!
##################
上面的写法,虽然最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束。
这就是<<和<<-的区别。