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

bic*_*jai 5 linux bash if-statement syntax-error unexpectendoffile

W/hen我运行以下代码片段

#!/bin/bash
if [ "foo" = "foo" ];
then
echo "true"
else
echo "false"
fi
echo "end"
Run Code Online (Sandbox Code Playgroud)

我明白了

sfm_write_buffer_test.sh: line 9: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*son 8

你在Cygwin,对吧?

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

true
end
Run Code Online (Sandbox Code Playgroud)

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

使用Windows样式的行结尾,bash没有看到then关键字; 它看到一个名为的命令then\r.它从不试图,因为它是扫描用于匹配来执行它then或者fi用于if关键字(其中确认,因为它不是在该行的末端).

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


den*_*som 5

问题是脚本末尾的 CRLF。当 Shell 脚本看到 Windows 样式的行结尾时,会引发此错误。您需要将 shell 脚本中的行结尾替换为 Unix 风格的 LF。每个 IDE 都有自己的方法来执行此操作。

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

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

进行更改并保存文件后,shell 脚本执行时应该不会出现错误。