在bash脚本中意外的“语法错误:文件的意外结束”在if语句上

时间:2011-08-29 23:23:12

标签: linux bash if-statement syntax-error unexpectendoffile

我/她运行以下代码片段

#!/bin/bash
if [ "foo" = "foo" ];
then
echo "true"
else
echo "false"
fi
echo "end"

我得到了

sfm_write_buffer_test.sh: line 9: syntax error: unexpected end of file

这没有任何意义。 echo语句工作正常,但遇到if语句时会出现上述错误。

3 个答案:

答案 0 :(得分:8)

你在Cygwin,对吗?

正如我在评论中所说,当我复制并粘贴您的脚本并在我的系统上运行它时,它可以工作;输出是

true
end

但是当我将行结尾从Unix样式'\n'更改为Windows样式'\r\n'时,我得到了同样的错误。

使用Windows样式的行结尾时,bash看不到then关键字;它会看到一个名为then\r的命令。它永远不会尝试执行它,因为它正在扫描匹配的thenfi if关键字(因为它不在行的末尾而识别出来)。

确保您的shell脚本使用Unix样式的行结尾。

答案 1 :(得分:3)

问题是脚本末尾的CRLF。 Shell脚本在看到Windows样式的行结尾时会抛出此错误。您需要使用Unix样式的LF替换shell脚本中的行结尾。每个IDE都有它自己的方式。

  

Sublime Text 2 ==>查看 - >线路结尾 - > Unix的

     

Notepad ++ ==>编辑 - > EOL转换 - > UNIX / OSX格式

进行更改并保存文件后,shell脚本应该无错误地执行。

答案 2 :(得分:0)

这不是您的具体问题,但如果您在if语句中粘贴了缩进的heredoc并且已从制表符转换为空格,则也会发生这种情况。由于空格,永远不会找到heredoc的结束分隔符,结果是意外的文件结尾。