在WSL中执行Bash脚本遇语法错误,求教原因与解决办法
问题原因与解决方案
你的脚本写法本身没问题,报错的核心原因是Windows与Linux的换行符格式不兼容:
- Windows系统默认用CRLF(
\r\n)作为换行符,而Linux/Unix系统用LF(\n)。 - 你在Windows环境下编辑的脚本,每行末尾会带一个隐藏的
\r字符,当WSL里的sh解析时,会把函数闭合的}后面的\r当成字符的一部分,导致shell认为函数没有正确闭合,因此抛出"expecting }"的语法错误。
解决方法
可以用以下几种方式修复:
- 用WSL工具转换换行符
先安装dos2unix工具(如果没装的话):
然后转换脚本:sudo apt update && sudo apt install dos2unixdos2unix helloworld.sh - 直接用sed命令移除多余的
\r
无需额外安装工具,执行:sed -i 's/\r$//' helloworld.sh - 编辑时直接设置LF换行
用代码编辑器(比如VS Code、Notepad++)编辑脚本时,将换行格式设置为LF:- VS Code:右下角状态栏可以切换换行格式,选择「LF」
- Notepad++:菜单栏「编辑」→「EOL转换」→「Unix(LF)」
修复后再执行wsl ./helloworld.sh就能正常输出Hello World!了。
内容的提问来源于stack exchange,提问作者RankinJ
相关产品推荐
相关产品推荐

