Shell脚本语法报错排查:line 65意外EOF问题求助
问题排查与解决
你的语法错误核心原因是here-doc结束分隔符的缩进问题,以及分隔符写法不符合bash规范:
错误点分析
- 结束分隔符存在前导空白:代码中
:EOF前面有缩进空格,bash要求here-doc的结束分隔符必须是单独一行的第一个字符,不能有任何前导空格、制表符,否则bash无法识别结束标记,会一直读取到脚本末尾,从而抛出unexpected EOF和unexpected end of file错误。 - 分隔符写法冗余:
:EOF不是bash here-doc的标准写法,若需要展开${ORA_USER}、${ID}这类变量,直接用EOF即可;若要抑制变量展开,用'EOF'包裹分隔符。
修正后的代码片段
while IFS="," read -r ID New; do USER_CHECK=$(sqlplus -S /nolog <<EOF CONNECT ${ORA_USER}/${ORA_USER}@${ORA_STRING}; set colsep , set linesize 32767 set pagesize 9999 set markup CSV on set feedback on set heading on SELECT COUNT(*) FROM ATTRIBUTES WHERE USER_ID = '${ID}'; quit EOF )
关键说明
- 结束的
EOF必须单独占一行,无任何前导空格,和开头的<<EOF完全匹配。 - 若想保留缩进可读性,可使用
<<-EOF(注意减号),此时结束分隔符前的制表符(Tab)会被忽略,但空格仍然不被允许,需确保脚本中用Tab而非空格缩进结束标记。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

