bash:双中括号和单中括号
内容
在 Bash 中,if
语句可以使用单个中括号([
)或者双中括号([[
)进行条件测试。这里的 [[
是一种更强大且推荐的语法,与单中括号相比,具有以下优点和特点:
为什么使用双中括号 [[ ]]
-
更强的条件测试功能:
[[
支持更复杂的条件测试,比如逻辑运算符(&&
、||
)、模式匹配(==
支持通配符)和正则表达式(=~
)。- 在你的例子中,
||
是逻辑运算符,用于判断两个文件是否都不存在。[[
是更适合处理逻辑运算的工具。
示例:
if [[ ! -f file1 || ! -f file2 ]]; thenecho "至少有一个文件不存在" fi
-
无需引用避免问题:
- 使用
[[
时,不需要给变量加引号来避免单词拆分或路径名扩展(globbing)。例如:
如果使用单中括号(file="my file with spaces" [[ -f $file ]] # 不需要加引号,也不会报错
[
),就需要加引号:file="my file with spaces" [ -f "$file" ] # 必须加引号,否则会报错
- 使用
-
语法更直观:
[[
提供了更加直观的语法,用于区分字符串比较和数字比较。比如:num=5 [[ $num -lt 10 ]] # 数值比较 [[ $str == "hello" ]] # 字符串比较
而在单中括号中,字符串比较需要额外注意语法的正确性。
-
防止意外的命令执行:
- 单中括号内部会解析命令,这可能导致一些不必要的副作用。而
[[
则不会执行命令,而是只进行条件测试。
示例:
cmd="rm -rf /" [ $cmd ] # 如果 cmd 未加引号,可能会误执行!
使用双中括号则完全避免这个问题:
[[ $cmd ]] # 不会执行命令,只做字符串测试
- 单中括号内部会解析命令,这可能导致一些不必要的副作用。而
为什么不是单中括号 [
?
单中括号 [
是 POSIX 标准的一部分,适用于更基础的条件测试,例如文件存在性检查或简单的字符串比较。它在功能和安全性上稍弱于双中括号。
例如:
if [ ! -f $failed_tests_file ] || [ ! -f $all_tests_file ]; thenecho "至少有一个文件不存在"
fi
虽然功能相同,但由于需要明确分开两次测试,且变量需要引号,这种写法更容易出错。
总结
[[
提供更安全、更灵活的条件测试语法,推荐在现代 Bash 脚本中优先使用。特别是在涉及逻辑运算符(如 ||
或 &&
)时,[[
的语法显得更加简洁和可靠。