未预期的符号,附近有语法错误

Windows 系统上面使用 Sublime text 3,创建了一个 Shell 文件,然后上传到 Linux 系统去执行。结果总是报错:未预期的符号,附近有语法错误,折腾了我一个多小时,反复仔细检查了脚本没有发现问题,最后没想到是文件的格式在不同操作系统下不兼容,本质是回车换行符的问题,气死我了。

问题出现

执行脚本文件,总是报错:

1
2
kafka_monitor_offset.sh: 行 16: 未预期的符号 `$'do\r'' 附近有语法错误 
'afka_monitor_offset.sh: 行 16:` do

但是回到脚本查看,又没有什么语法错误。

仔细回想了一下,突然想到:自己是在 Windows 系统上面创建、编辑的 Shell 脚本文件,而现在是放在 Linux 系统上面来执行,大概率是这个问题了,朝这个方向找找原因。

问题解决

先用最简单的方式尝试了一下,即在 Linux 系统上面重新创建 Shell 文件,然后编辑填充内容,执行没问题,一次成功,顿时喜悦又崩溃。

那接着就可以回到前面的问题了,如果非要在 Windows 系统上面编辑文件,该怎么解决呢?或者说我收到的是同事发过来的文件,该怎么解决呢?

其实,也是有办法的,这个问题早就有人遇到过了,并且考虑周全,早就给了解决方案。

首先,可以使用 vim 工具来验证文件的系统格式::set ff。如果结果为 fileformat=unix 说明可以在 Linux 系统上面执行,如果结果为 ileformat=dos 说明是 Windows 格式的文件,无法直接在 Linux 系统上面执行,需要转换。

转换方式有多种多样,以下列出几种:

1、解铃还须系铃人,自己惹的事自己平,那就继续使用 Sublime text 3 文本编辑器,再给它个机会。依次选择首选项、设置、用户,就会弹出配置文件,在里面加上配置项:"default_line_ending": "unix",保存。

设置了文件的默认格式,之后新建的脚本文件默认就可以在 Linux 上面执行了。

2、使用 vim 工具,直接设置 :set ff=unix 或者 :set fileformat=unix,效果一样。设置后,脚本文件的格式就自动转换为 Linux 系统上面可以使用的。

3、手动搜索替换,这是最原始的方案,既然是回车换行符造成的【有时候不一定是】,那就手动把它替换掉就行了。由于在 Windows 系统上面,回车换行符号是 \n\r,而在 Linux 系统上面是 \n,所以把 \r 去掉就行了。例如使用 sed 命令:sed -i"s/\r//"file.sh

4、使用 dos2unix 工具,如果系统上面安装了 dos2unix 工具,可以使用它转换:dos2unix file.sh,效果和 vim 工具一样。

5、另外使用一些文本编辑器,例如:UltraEditEditPlusNotePad,也可以一键转换,读者自行搜索解决方案。

问题总结

工程师还是买 Mac 办公比较好,攒钱买它!

虾丸派 wechat
扫一扫添加博主,进技术交流群,共同学习进步
永不止步
0%