记一次 shell 'EOF' 语法错误

2,202 阅读1分钟

最近在看关于 linux 的书,跟着书学习用 shell 脚本向 MySQL 服务器发送命令,入了个很隐蔽的坑,以此记录。

原文是这样的:

$ cat mtest3 #!/bin/bash 
# send data to the table in the MySQL database 
MYSQL=$(which mysql) 
if [ $# -ne 4 ] 
then 
 echo "Usage: mtest3 empid lastname firstname salary" 
else 
 statement="INSERT INTO employees VALUES ($1, '$2', '$3', $4)" 
 $MYSQL mytest -u test << EOF 
 $statement 
EOF  
 if [ $? -eq 0 ] 
 then 
 echo Data successfully added 
 else 
 echo Problem adding data 
 fi 
fi

看了觉得能看懂,又懒,直接复制到了脚本中,一运行报了如下错误:

./mtest3:行18: 警告:立即文档在第 9 行被文件结束符分隔 (需要 `EOF')
./mtest3:行19: 语法错误: 未预期的文件结尾

为了排查这个错误总之是费了很多时间,最后找到的问题在这里:第二个文件结束符 **EOF**

后面多了一个空格

根本看不出来,算是非常隐蔽了。