意思是:在意料之外的标记`$'in\r'`附近出现了语法错误。

62

我正在尝试编译NIST生物特征图像软件,但我一整天都遇到问题。最终我成功检出了源代码,并且无误地安装了cygwin(我以前用过它),但是当我尝试编译时,出现了以下错误:

 $  sh setup.sh </cygdrive/c/NBIS> [--without-X11]
 setup.sh: line 94: syntax error near unexpected token `$'in\r''
 'etup.sh: line 94: `    case $1 in

现在,我相信任何高级的程序员都会去检查setup.sh中是否有问题,但我不是太懂编程(我只是编译这个程序,因为没有预编译的软件包),所以我不知道该怎么办。我没有使用cygwin安装任何库,我只是保留了所有默认设置。我正试图按照NBIS手册操作,但我并不是非常理解它,所以我非常困难。也许你看一下手册,可能会注意到我错过了什么:http://www.nist.gov/customcf/get_pdf.cfm?pub_id=51097


这里的每个人似乎都建议使用Linux风格的换行符,如果需要使用Windows风格的换行符来运行Bash脚本,有人知道该怎么做吗? - Groostav
你知道问题所在。你知道问题(在单词“in”后面有一个换行符)。为什么不用一个好的十六进制编辑器来查看文件呢?顺便说一句,@Groostav:我不认为问题仅仅是一个带有CRLF行结束符的脚本。如果是这样的话,它很可能早就已经退出了。 - undefined
6个回答

91

运行

sed -i 's/\r//' setup.sh

修复你的行尾


sed -i 's/\r//' setup.sh 太棒了! - Frank Guo

74

这是行尾不匹配的症状。

要将 setup.sh 转换为 Cygwin 上的 Unix 行尾,请使用:

dos2unix setup.sh

19

将example.sh文件转换为Unix的简单方法是使用NotePad++ (编辑>EOL转换>UNIX/OSX格式)

您还可以在notepad++中设置默认的EOL (设置>首选项>新文档/默认目录>在格式框中选择Unix/OSX)


2
谢谢,对我有用。我在Windows 10上的Linux Ubuntu子系统中编译Shell脚本时遇到了这个问题,但是我是在Notepad++中输入命令而不是通过vim或nano。 - iamjoshua

16
在PyCharm中,您可以通过单击屏幕右下角的字母CRLF并选择LF来快速更改行尾。

pycharm line endings location


是的,使用VS Code将CRLF更改为LF是最快捷的方法。 - mastermind.pk
它也适用于PHPStorm,所以只需要进行composer构建就可以了。 - undefined
是的,据我所知,它适用于任何Jetbrains IDE(IntelliJ,WebStorm,PHPStorm,PyCharm等)。 - undefined

12

Windows使用两个字符(CR和LF,或者\r\n)来标记文本文件中一行的结尾。Unix、Linux以及(默认情况下)Cygwin使用单个LF或者'\n'字符。一些Cygwin工具可以处理任意格式的换行符,但是sh通常不能。

看起来setup.sh使用的是Windows风格的换行符,至少第94行是这样的。

我没有找到源代码的下载地址,但如果它们被分发为zip文件,则可能需要使用Cygwin的unzip命令并使用-a选项进行提取,以便自动转换任何行结束符。

但我怀疑其中还有更多内容。分发的setup.sh文件首先不应该有任何Windows风格的换行符,如果有的话,我不知道为什么问题直到第94行才会出现。

如果您能发布源代码下载地址的URL,我会查看setup.exe


0
我以前也遇到过同样的问题,但是我用Notepad++解决了它。
安装Notepad++,用Notepad++打开你的shell代码,进入"编辑"菜单,选择"EOL转换",选择"Unix (LF)"选项,问题就会解决了。
或者,如果你使用Visual Studio Code,你可以将CRLF改为LF。 Visual Studio Code Notepad++

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接