前言
- 本文的脚本在CentOS7中已测试
介绍
EOF是END Of File的缩写,表示自定义终止符。在linux按ctrl-d就代表EOF。
Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。
用途
编写自动执行的脚本时很有用。比如,自动执行的mysql脚本,自动执行的sftp、ftp脚本等。
注意事项
- 格式为:
shell> shell命令 <<EOF
exit
EOF
比如这样
shell> ftp<<EOF
exit
EOF
- 第1个EOF的后一行开始 到 第2个EOF的前一行结束,之间为EOFd内容可以自动输入。
- 第1个EOF的同一行中,在EOF后面还可以有其它的命令,且不作为EOF内容。
- 第2个EOF必须自己独占一行,且EOF前后不能有任何东西。
EOF
不是关键字,可以随便改,比如可以改成HELLO
、!
、…<<
是关键字,不能修改- EOF不是万能的。当命令不支持EOF时,那就需要换用另外的办法。比如mysql的密码输入,就不支持EOF(mysql的高版本中,已经不能把密码作为mysql命令的参数了)。
示例1
模拟输入ftp命令。人工输入时,是这样的
shell> ftp
# 这里已经切换到了ftp命令下
ftp> exit
shell>
如果需要shell脚本在ftp命令下输入exit命令,则需要搭配EOF使用。如下:
shell> ftp<<EOF
exit
EOF
shell>
上面这段儿的执行效果与上上面的那段儿执行效果一致。但,上面这段已经省去了人工输入exit
命令。
示例2
将内容Hello World
写到a.txt
中:
shell> cat <<EOF >a.txt
Hello World
EOF
shell> cat a.txt
Hello World
示例3
还可以使用命令替换:
shell> cat <<EOF >a.txt
today is `date`
i am in dir `pwd`
I can read numbers
`for i in $(seq 1 10)
do
echo $i;
done`
EOF
shell> cat a.txt
today is Tue Mar 16 10:44:44 CST 2021
i am in dir /root
I can read numbers
1
2
3
4
5
6
7
8
9
10
参考
Linux shell 中
(
)
‘
‘
,
() ` `,
()‘‘,{},$[] $(()),[ ] (( )) [[ ]]作用与区别
bash之命令替换(command substitution)
Linux中的文件分界符EOF
linux下EOF写法梳理
Shell中重定向<<EOF注意事项