当我运行以下代码片段时
#!/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 语句时,它会给出上述错误。
当我运行以下代码片段时
#!/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 语句时,它会给出上述错误。
你在 Cygwin 上,对吧?
正如我在评论中所说,当我复制并粘贴您的脚本并在我的系统上运行它时,它可以工作;输出是
true
end
但是,当我将行尾从 Unix 样式'\n'
更改为 Windows 样式'\r\n'
时,我会遇到与您相同的错误。
使用 Windows 风格的行尾,bash 看不到then
关键字;它看到一个名为then\r
. 它从不尝试执行它,因为它正在扫描匹配项then
或关键字(它识别出来是因为它不在行尾)fi
。if
确保你的 shell 脚本使用 Unix 风格的行尾。
问题是脚本末尾的 CRLF。Shell 脚本在看到 Windows 样式的行结尾时会抛出此错误。您需要用 Unix 风格的 LF 替换 shell 脚本中的行尾。每个 IDE 都有自己的方法。
Sublime Text 2 ==> 查看 -> 行尾 -> Unix
Notepad++ ==> 编辑 -> EOL 转换 -> UNIX/OSX 格式
进行更改并保存文件后,shell 脚本应该会正确执行。
这不是您的具体问题,但是如果您在 if 语句中粘贴了缩进的 heredoc 并且它已从制表符转换为空格,也会发生这种情况。由于空格,永远找不到heredoc的结束分隔符,结果是文件意外结束。