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

系统版本如下:

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

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

问题复现

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

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

使用 sh 命令执行会报错。

$ sh test.sh prod
test.sh: 4: [: prod: unexpected operator
test.sh: 6: [: prod: unexpected operator
您输入的我不认识!

使用 bash 命令执行正常。

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

原因

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

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

解决办法:

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

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