现象

在 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/ubuntush 命令默认是指向 dash,而不是 bash

又因为 dash 是比 bash 还轻量的,只支持基本的 shell 功能,其中不包括刚才那种数组初始化,所以才会识别不了,直接报 Syntax error

解决方案

解决方案很简单,给出三种方案

  1. 直接使用 bash 执行命令
1
bash xxx.sh
  1. 为 shell 脚本显式指定解释器为 bash,即在 shell 脚本的首行添加一行(实际上在shell脚本首行添加指定bash是规范的操作
1
#!/bin/bash
  1. 修改默认的 sh,可以采用命令 sudo dpkg-reconfigure dash,在配置菜单中选 no