暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

EOF说明

原创 不吃草的牛_Nick 2022-07-19
803

shell中<<结合EOF说明:
Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。
可以把EOF替换成其他字符,意思是把内容当作标准输入传给程序。

当shell看到<<的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,
直到shell又看到该分界符(位于单独的一行)。
这个分界符可以是你所定义的任何字符串。

当存在报错:
-bash: line 6: warning: here-document at line 2 delimited by end-of-file (wanted `EOF’)

注意检查以下事项:
1.存在EOF的项都要顶格编写
2.<<和EOF之间不能有空格
3.EOF左右不能有空格
4.如果存在多个需要分界,可以使用EOF1和EOF2……
5.set 命令不能与select语句放在一行,会报SP2-0158: unknown SET option "select"
6.不要漏掉最后的EOF右上角的反点符号


test=`sqlplus -s "/ as sysdba" <<EOF
set heading off feedback off pagesize 0 verify off echo off numwidth 9
select 1 from dual;
EOF`

oracle启停脚本示例:
PS:以下两个脚本都是在root用户下执行的脚本,因为root切换到oracle用户下不需要输入密码。

#启动oracle(先启动监听,然后启动数据库服务)
su - oracle <<EOF1
lsnrctl start
sqlplus <<EOF2
sys as sysdba
startup;
quit;
EOF2
EOF1
exit 0

#停止oracle(先停数据库服务,然后停止监听)
su - oracle <<EOF1
sqlplus <<EOF2
sys as sysdba
shutdown immediate
quit
EOF2
lsnrctl stop
EOF1
exit 0


-------------
EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按 ctrl-d 就代表EOF.
EOF一般会配合cat能够多行文本输出.

其用法如下:
<<EOF //开始

EOF //结束


通过cat配合重定向能够生成文件并追加操作,在它之前先熟悉几个特殊符号:
< :输入重定向
> :输出重定向
>> :输出重定向,进行追加,不会覆盖之前内容
<< :标准输入来自命令行的一对分隔号的中间内容.


-----------------
我经常使用 here document 和 <()来写脚本

awk –f <(cat <<EOF
{
…… $abc ….
}
EOF
)

我发现一个问题 <<EOF 这种here document 和 双引号字符串("")有相同的 解析效果,就是会对 $name, ${name}进行变量替换, 也会对$()进行命令替换。使用 \$, 可以解决这个问题。但这影响了here document 的可读性。有什么更好的方法吗?

<<'EOF' 救星来了

如果定界符被任何引号括住,shell 就不会对变量进行替换。

abc=ok
cat <<'EOF'
$abc
EOF

or

cat <<"EOF"
$abc
EOF
输出: $abc


abc=ok
cat <<EOF
$abc
EOF
输出: ok


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论