问题描述

在 Windows 10 自带的 Ubuntu 20.04 子系统终端,执行 Shell 脚本时出现 Bad substitution 错误:

1
2
➜  ~ sh +x tt.sh
tt.sh: 11: Bad substitution

Shell 脚本是从服务器上下载下来的,在服务器上是可以正确执行的,服务器系统为 CentOS 7。

解决方法

第一感觉应该是该 Shell 脚本在 Ubuntu、CentOS 两个系统不兼容的关系。

打开脚本文件,跟踪出错位置(第 11 行),定位到这行代码 day=${dt:6}

查了 Ubuntu 官方文档,发现从 Ubuntu 6.10 开始,系统默认 Shell (/bin/sh) 由 bash shell 更改为 dash shell 了,原因是 dash shell 更轻量,运行更快。

查看 /bin/sh 在 Ubuntu 系统的链接:

1
2
➜  ~ ll /usr/bin/
lrwxrwxrwx 1 root root 4 Feb 25 2020 sh -> dash

而在服务器 CentOS 系统,链接的是 bash:

1
2
[hadoop@bigdata ~]$ ll /usr/bin/
lrwxrwxrwx 1 root root 4 Mar 9 2020 sh -> bash

为了在本地开发机器能够兼容在服务器上执行的脚本文件,这里需要将 Ubuntu 的 /bin/sh 的默认链接更换为 bash,文档给出的方案是在终端执行以下命令,然后选择 < No > 即可:

1
➜  ~ sudo dpkg-reconfigure dash

后面如果需要将 /bin/sh 的默认链接换回 dash,同样执行上面的命令,并选择 < Yes >。

如果想了解更多,可以查看官方维基:https://wiki.ubuntu.com/DashAsBinSh

(END)