1、EOF
Shell中通常将EOF与 << 结合使用,表示后续的输入作为子shell的命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。
可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。
当shell看到< <的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作stdin,直到shell又看到该分界符(位于单独的一行)。这个分界符所包含的区域内可以定义的任何命令。
Example:自动登录mysql(root:root,passwd:123456),查询test库,test表里的user=aa的记录。
复制代码代码如下:
#! /bin/bash
mysql -uroot -p123456 <<EOF
use test;
select * from test while id = 1001;
exit
EOF
特殊用法:
字符并不是只能用EOF也可以其它的:
: << COMMENTBLOCK
shell脚本代码段
COMMENTBLOCK
echo start
:<<COMMENTBLOCK
echo
echo "this is a test"
echo
COMMENTBLOCK
echo end
cat和eof结合使用具有追加功能
使用Cat和EOF多行输入
cat >> ./test.txt <<EOF
Hello Word!
good good study,day day up!
EOF
以上的脚本命令是,在tets.txt文件后面加上2行代码。
2、shell 中 << 和 <<-的区别:
在我们使用cat <<EOF时,我们输入完成后,需要在一个新的一行输入EOF结束stdin的输入。EOF必须顶行写,前面不能用制表符或者空格。比如,下面的语句就不会出错:
<span style="font-size:18px;">cat <<EOF
Hello,world!
EOF</span>
如果结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入。而<<-就是为了解决这一问题:
cat <<-EOF
Hello,world!
EOF
上面的写法,虽然最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束。
这就是<<和<<-的区别。
3、在shell script中使用cat <<_EOF_ 和 cat <<-_EOF_ ,其区别和上述解释一样。
<span style="font-size:18px;">#!/bin/bash
# Program to output a system information page
TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"
report_uptime () {
cat <<-_HHH_
<H2>System Uptime</H2>
<PRE>$(uptime)</PRE>
_HHH_
return
}
report_disk_space () {
cat <<-_EDD_
<H2>Disk Space Utilization</H2>
<PRE>$(df -h)</PRE>
_EDD_
return
}
#函数中的每行必须对齐,要空只能使用TAB键,否者脚本不能正确运行
report_home_space () {
cat <<- _EOF_
<H2>Home Space Utilization</H2>
<PRE>$(du -sh /home/*)</PRE>
_EOF_
return
}
cat <<_EOF_
<HTML>
<HEAD>
<TITLE>$TITLE</TITLE>
</HEAD>
<BODY>
<H1>$TITLE</H1>
<P>$TIME_STAMP</P>
$(report_uptime)
$(report_disk_space)
$(report_home_space)
</BODY>
</HTML>
_EOF_
</span>