【问题标题】:in bash script unexpected "syntax error: unexpected end of file" on if statement [duplicate]在 bash 脚本中,if 语句出现意外的“语法错误:文件意外结束”[重复]
【发布时间】:2011-08-29 23:23:12
【问题描述】:

当我运行以下代码 sn-p

#!/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 语句时会出现上述错误。

【问题讨论】:

  • 尝试删除 if 语句后面的分号
  • 我只是将以上内容复制并粘贴到我系统上的脚本中并运行它。输出为两行:trueend。与 bash 版本 2.01.1、3.2.25 和 4.2.8 的结果相同。
  • 这是我们最常见的常见问题解答之一。很惊讶它花了这么长时间才完成复制。

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


【解决方案1】:

你在 Cygwin 上,对吗?

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

true
end

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    一旦您做出更改并保存文件,shell 脚本应该会正确执行。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        最近更新 更多