判断两个字符串是否相等应使用[ "$a" = "$b" ](POSIX兼容)或[[ "$a" == "$b" ]](Bash增强),等号两侧必须空格,变量须加双引号防空值报错;禁用-eq等数值符比较字符串。

在 Linux Shell 中判断两个文本内容是否相等,核心是用好 [ ](test 命令)或 [[ ]],并注意语法细节。最常用、最稳妥的方式是使用 = 或 ==,但它们的行为和适用场景略有不同。
用 [ ] 判断字符串是否相等
标准 POSIX 兼容写法,推荐用于可移植脚本:
- 必须用单个等号
=,且等号两侧**必须有空格**; - 变量必须用双引号包裹,防止空值或含空格时出错,例如:
[ "$a" = "$b" ]; - 如果变量未定义或为空,不加引号会变成
[ = "xxx" ],直接报错[: =: unary operator expected; -
!=同理可用,表示不相等。
用 [[ ]] 判断字符串是否相等
Bash/zsh 等现代 shell 支持的增强语法,更安全、功能更强:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 支持
==和=(效果相同),也支持!=; - 变量即使不加引号,一般也不会因为空值崩溃(但加引号仍是好习惯);
- 支持通配符匹配,比如
[[ $str == a* ]]可判断是否以a开头; - 不进行 pathname expansion(避免误匹配当前目录文件),比
[ ]更可靠。
常见错误与规避方法
这些坑实际中高频出现,容易导致脚本意外失败:
- 写成
[ $a=$b ](缺空格)→ 解析为一个单词,报错[: too many arguments; - 写成
[ $a == $b ](用==配[ ])→ 在某些老 shell 中不被识别,行为不可靠; - 忽略空值:当
a=(空)时,[ $a = "x" ]实际执行的是[ = "x" ],触发语法错误; - 混用数字比较符:比如用
-eq比较字符串([ "abc" -eq "abc" ])→ 会尝试转成数字,结果总是 0 或报错,不是字符串比较逻辑。
快速验证是否相等的实用写法
写脚本时,可直接套用下面任一结构(推荐带引号 + [[ ]]):
-
安全通用型(推荐):
if [[ "$str1" == "$str2" ]]; then echo "相等"; fi -
POSIX 兼容型(如需 dash/sh):
if [ "$str1" = "$str2" ]; then echo "相等"; fi -
检查是否为空再比较(更严谨):
if [ -n "$str1" ] && [ -n "$str2" ] && [ "$str1" = "$str2" ]; then ...

















