问题:Ubuntu系统的默认shell比较字符串报错

问题:Ubuntu系统的默认shell比较字符串报错

系统版本如下:

从 /etc/issue 文件中查看系统版本:

1
2
$ cat /etc/issue
Ubuntu 20.04.4 LTS \n \l

问题复现

创建一个测试文件 test.sh ,其代码如下:

1
2
3
4
5
6
7
8
#!/bin/bash
if [ "$1" == "prod" ] ;then
echo "您输入是 prod ..."
elif [ "$1" == "dev" ] ;then
echo "您输入是 dev ..."
else
echo "您输入的我不认识!"
fi

使用 sh 命令执行会报错。

1
2
3
4
5
6
7
8
9
10
11
$ sh test.sh prod
test.sh: 4: [: prod: unexpected operator
test.sh: 6: [: prod: unexpected operator
您输入的我不认识!
````

使用 bash 命令执行正常。

```sh
$ bash test.sh prod
您输入是 prod ...

原因

Debian和Ubuntu 系统中,默认的 sh 命令指向的是 dash 命令,这个dash的语法和 bash 很不同。

1
2
$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4 May 22 2020 /bin/sh -> dash

解决办法:

(1) 修改命令,将 Ubuntu 的 sh 的默认 dash 改成 bash。或者执行的时候指明是 bash 命令,不用 sh 命令。

(2) 修改代码,改成严格的 dash 代码。