一尘不染

意外令牌'-bash附近的语法错误

linux

我在Mac上写了一个示例脚本

#!/bin/bash
test() {
  echo "Example"
}
test
exit 0

通过显示Example可以正常工作

当我在RedHat机器上运行此脚本时,它说

意外令牌附近的语法错误’

我检查了bash是否可用

cat /etc/shells

which bash shows /bin/bash

有人遇到过同样的问题吗?

提前致谢 !


阅读 190

收藏
2020-06-07

共1个答案

一尘不染

这可能是文件编码问题。

在不同操作系统和编辑器之间处理文件时遇到了文件类型编码问题,在我的情况下,尤其是在Linux和Windows系统之间。

我建议检查文件的编码,以确保它适合目标linux环境。与使用Windows文本编辑器相比,与使用Windows文本编辑器相比,使用MAC编码的可能性较小,但是我认为文件编码仍然值得考虑。

-–编辑(按照@Potatoswatter的建议添加实际的解决方案)

为了演示文件类型编码可能是这个问题的方法,我将示例脚本复制/粘贴到Windows的记事本中(我无法访问Mac),然后将其复制到Linux机器并运行:

jdt@cookielin01:~/windows> sh ./originalfile             
./originalfile: line 2: syntax error near unexpected token `$'{\r''
'/originalfile: line 2: `test() {

在这种情况下,记事本使用回车符和换行符保存了文件,从而导致上面显示的错误。该\r表示回车(Linux系统终止换行符行\n只)。

在Linux机器上,您可以通过运行以下命令从文件中删除回车符(如果存在)来测试此理论:

cat originalfile | tr -d "\r" > newfile

然后尝试运行新文件sh ./newfile。如果可行,则问题是回车以隐藏字符的形式出现。

注意: 这不是您环境的精确复制(我无法使用Mac),但是在我看来,问题似乎是某个地方保存了回车符的编辑器返回了文件。

-/编辑

为了详细说明,操作系统和编辑器可以具有不同的文件编码默认值。通常,应用程序和编辑器将影响所使用的文件类型编码,例如,我认为MicrosoftNotepad和Notepad++默认为Windows-1252。也可能需要考虑换行符的差异(在Windows环境中,回车符和换行符通常用于终止文件中的行,而在Linux和OSX中,通常仅使用换行符)。

2020-06-07