1、在命令行环境下,使用cat <<EOF 和 cat <<-EOF,两个都是获取stdin,并在EOF处结束stdin,输出stdout。
在我们使用cat <<EOF时,我们输入完成后,需要在一个新的一行输入EOF结束stdin的输入。EOF必须顶行写,前面不能用制表符或者空格。比如,下面的语句就不会出错:
例1:
cat <<EOF
Hello,world!
EOF
如果结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入。而<<-就是为了解决这一问题:
例2:
cat <<-EOF
Hello,world!
EOF
上面的写法,虽然最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束。
这就是<<和<<-的区别。
2、在shell script中使用cat <<_EOF_ 和 cat <<-_EOF_ ,其区别和上述解释一样。
例3:
#!/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_
3、字符并不是只能用EOF也可以其它的,像例3这样。