2011-08-29 68 views
4

W /母鸡我运行下面的代码片段在bash脚本意外“语法错误:意外的文件结尾”关于if语句

#!/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语句时,它会提供上述错误。

+4

尝试的if语句 –

+1

我只是复制并粘贴上述去除尾随分号到一个脚本我的系统上并运行它。输出是两行:'true'和'end'。与bash版本2.01.1,3.2.25和4.2.8的结果相同。 –

+0

这是我们最常见的常见问题之一。惊讶的是,它花了这么长时间来完成一个重复。 –

回答

8

你在Cygwin上吧?

正如我在评论说,当我复制并粘贴您的脚本,我的系统上运行它,它的工作原理;输出

true 
end 

但是,当我改变行结束从Unix样式'\n'到Windows风格'\r\n',我让你得到了同样的错误。

随着Windows风格的行尾时,bash不会看到then关键字;它会看到名为then\r的命令。它从不试图,因为它是扫描匹配thenfi用于if关键字(其中确认,因为它不是在该行的末尾)来执行它。

确保你的shell脚本使用Unix风格的行结束符。

3

问题是脚本末尾的CRLF。当Shell脚本看到Windows风格的行尾时会抛出此错误。您需要用Unix风格的LF替换shell脚本中的行结尾。每个IDE都有自己的做法。

Sublime Text 2 ==> View -> Line Endings -> Unix

Notepad++ ==> Edit -> EOL Conversion -> UNIX/OSX Format

一旦你做了这个改变并保存文件,shell脚本应该执行没有错误。

0

这不是你的具体问题,但是这也有可能发生,如果您粘贴一个缩进定界符您的if语句里,它已经从标签到空间转换。由于空白,绝不会找到heredoc的结束分隔符,并且会导致意外的文件结束。