在写 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