5

当我运行以下代码片段时

#!/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

3 回答 3

9

你在 Cygwin 上,对吧?

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

true
end

但是,当我将行尾从 Unix 样式'\n'更改为 Windows 样式'\r\n'时,我会遇到与您相同的错误。

使用 Windows 风格的行尾,bash 看不到then关键字;它看到一个名为then\r. 它从不尝试执行它,因为它正在扫描匹配项then或关键字(它识别出来是因为它不在行尾)fiif

确保你的 shell 脚本使用 Unix 风格的行尾。

于 2011-08-29T23:33:56.410 回答
4

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

Sublime Text 2 ==> 查看 -> 行尾 -> Unix

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

进行更改并保存文件后,shell 脚本应该会正确执行。

于 2015-06-05T15:09:02.600 回答
0

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

于 2016-10-16T04:04:10.397 回答