Ubuntu下执行sh脚本报错Syntax error unexpected
现象
在 centos 下可以运行的脚本,拷贝到 ubuntu 下直接执行报错:
1 | ./xxx.sh: 5: ./xxx.sh: Syntax error: "(" unexpected |
检查脚本没有问题,使用命令调试执行脚本时也没有问题:
1 | bash -x xxx.sh |
排查
使用调试执行没有问题,就证明脚本本身没有问题,那就是环境可能有问题。
也就是说,直接执行脚本时,不是使用 bash
执行的。
经查,在 ubuntu 上,sh
是 /bin/dash
的软链接,好吧,直接执行脚本是 dash
原因
其他常见的 linux 发行版,虽然很多是将 sh
指向 bash
,但是在 debian/ubuntu
上 sh
命令默认是指向 dash
,而不是 bash
又因为 dash
是比 bash
还轻量的,只支持基本的 shell 功能,其中不包括刚才那种数组初始化,所以才会识别不了,直接报 Syntax error
解决方案
解决方案很简单,给出三种方案
- 直接使用
bash
执行命令
1 | bash xxx.sh |
- 为 shell 脚本显式指定解释器为 bash,即在 shell 脚本的首行添加一行(实际上在shell脚本首行添加指定bash是规范的操作)
1 |
- 修改默认的 sh,可以采用命令
sudo dpkg-reconfigure dash
,在配置菜单中选 no
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Martin's Blog!
评论
TwikooGiscus