Bash脚本中比较字符串的几种实用写法

在写 Bash 脚本时,经常需要判断两个字符串是否相等、哪个更长、或者某个字符串是否为空。比如你写了个备份脚本,想检查用户输入的目录名是不是空;又或者写了个部署脚本,要确认当前环境是 prod 还是 dev 才决定加载哪套配置——这些都绕不开字符串比较。

基本相等判断:用双中括号最稳妥

推荐优先使用 [[ ]],它比旧式的 [ ] 更安全,不会因变量未引号包裹或含空格而报错:

name="alice"
if [[ "$name" == "alice" ]]; then
echo "欢迎 Alice"
fi

注意:===[[ ]] 中效果一样,但 == 更直观;而 [ ] 里只能用 =(用 == 可能被当成字面量匹配)。

不相等、包含、前缀后缀判断

[[ ]] 还支持模式匹配:

file="config.prod.yaml"

# 判断是否以 prod 开头
if [[ "$file" == prod* ]]; then
echo "这是生产配置"
fi

# 判断是否包含 .yaml
if [[ "$file" == *.yaml ]]; then
echo "是 YAML 文件"
fi

# 不相等
if [[ "$file" != "config.dev.yaml" ]]; then
echo "不是开发配置"
fi

判空:别只记得 -z,还有更清晰的写法

判断字符串是否为空,常用 -z,但其实直接用 [[ $str ]] 更易读:

user_input=""

# 推荐:语义清晰
if [[ -z $user_input ]]; then
echo "输入为空"
fi

# 等价写法(非空才为真)
if [[ $user_input ]]; then
echo "有输入内容"
else
echo "输入为空"
fi

按字典序比较大小

<> 可以做字典序比较(注意必须写在 [[ ]] 内,且要用引号包裹变量):

a="apple"
b="banana"

if [[ "$a" < "$b" ]]; then
echo "apple 在 banana 前面"
fi

# 注意:不要写成 [ $a < $b ] —— 这会被 shell 当作重定向操作!

区分大小写?默认就是区分的

Bash 字符串比较默认区分大小写。如果想忽略大小写,可以用 shopt -s nocaseglob 配合通配符,或转小写再比:

input="YES"
if [[ "${input,,}" == "yes" ]]; then
echo "用户点了确认"
fi

实战小例子:一个带校验的交互脚本

假设你写了个一键安装工具,要用户输入版本号:

read -p "请输入版本号(如 v1.2 或 latest): " version

if [[ -z $version ]]; then
echo "错误:版本号不能为空"
exit 1
elif [[ $version == latest ]]; then
echo "准备拉取最新版..."
elif [[ $version == v* ]]; then
echo "准备安装版本 $version..."
else
echo "错误:版本号格式不合法,应为 'latest' 或 'vX.Y'"
exit 1
fi