双中括号[[ ]]是Bash内置关键字,语法更安全、语义更清晰,可避免词法分割、通配符展开、重定向误触发等问题,支持无需引号的变量比较、&&/||逻辑运算及正则/通配符匹配。

双中括号 [[ ]] 是 Bash 内置关键字,不是外部命令,语法更安全、语义更清晰。相比单中括号 [ ](本质是 /usr/bin/[ 命令),它能规避词法分割、通配符展开、重定向误触发等常见陷阱。
避免空格和变量未引号导致的语法错误
单中括号对未加引号的变量极易出错:
-
x="a b"; [ $x = "a b" ]→ 展开为[ a b = "a b" ],报错:too many arguments -
x="a b"; [[ $x = "a b" ]]→ 正确匹配,无需引号(内部自动处理空白)
支持更自然的逻辑运算符和模式匹配
双中括号原生支持 &&、|| 和正则/通配符匹配,无需额外转义或拼接:
-
[[ $str == a? ]]→ 匹配单字符通配(如ab、ax) -
[[ $str =~ ^[0-9]+$ ]]→ 支持正则判断是否纯数字 -
[[ $a == "yes" && $b -gt 10 ]]→ 混合字符串与整数比较,无语法错误 -
[ $a = "yes" -a $b -gt 10 ]→ 已被 POSIX 弃用,且易因空值崩溃
防止重定向和子shell意外解析
在单中括号中,、<code>(、&& 等符号按 shell 普通规则解析,容易引发歧义:
[ a → 被当作输入重定向,报错或静默失败[[ a → 正确执行字典序比较-
[ ( a = a ) ]→()触发子shell,语法错误 -
[[ ( a = a ) ]]→ 括号作为分组符号,合法且直观
兼容性提醒与推荐写法
双中括号是 Bash / Zsh / Ksh 等主流 shell 的扩展,不适用于严格 POSIX sh(如 dash)。若脚本需跨 shell 运行,应明确指定解释器:#!/bin/bash。日常开发中建议统一使用:
- 字符串比较:一律用
[[ $var == "xxx" ]]或[[ $var =~ pattern ]] - 整数比较:仍可用
[ $n -eq 5 ],但混用时优先[[ $n -eq 5 ]]保持风格一致 - 始终对变量使用
$var形式,不加引号也安全,但含路径等复杂内容时仍建议加引号防意外


















