在 Windows 系统上面使用 Sublime text 3,创建了一个 Shell 文件,然后上传到 Linux 系统去执行。结果总是报错:未预期的符号,附近有语法错误,折腾了我一个多小时,反复仔细检查了脚本没有发现问题,最后没想到是文件的格式在不同操作系统下不兼容,本质是回车换行符的问题,气死我了。
问题出现
执行脚本文件,总是报错:
1 | kafka_monitor_offset.sh: 行 16: 未预期的符号 `$'do\r'' 附近有语法错误 |
但是回到脚本查看,又没有什么语法错误。
仔细回想了一下,突然想到:自己是在 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、另外使用一些文本编辑器,例如:UltraEdit、EditPlus、NotePad,也可以一键转换,读者自行搜索解决方案。
问题总结
工程师还是买 Mac 办公比较好,攒钱买它!

