POSIX标准下Shell脚本条件语句:[与[[的用法困惑求解
关于Shell条件语句中
[与[[的用法梳理 嘿,我完全懂这种纠结!最近我也泡了好多脚本教程和文档(主要啃Bash相关的),为了保证脚本能在各种环境跑,一直盯着POSIX标准看,但条件语句这块,特别是[和[[的区别,真的绕了好一阵子才理清楚。咱们先把test命令放一边,专门拆解这俩括号的用法:
先说说[(POSIX标准写法)
- 兼容性拉满:这货虽然看起来有点“老派”,但所有符合POSIX标准的Shell都支持——早期它其实是
/bin/test的硬链接/别名,后来大部分主流Shell把它集成成了内置命令,不管是老掉牙的Shell还是轻量的BusyBox/Dash,都能认它。 - 语法细节要抠死:
- 括号前后必须加空格,比如
[ "$VAR" = "foo" ],少了空格直接报错; - 变量一定要用双引号包起来,不然遇到空格、特殊字符或者空值,脚本直接炸锅;
- 比较规则严格遵循POSIX:数字比较用
-eq/-gt/-lt,字符串比较用=/!=,不能用>/<(那是重定向符号); - 逻辑组合得用
&&/||分开写,不能在括号里直接嵌套,比如要写“且”的逻辑,得写成[ "$A" = "yes" ] && [ "$B" -gt 0 ],而不是[ "$A" = "yes" && "$B" -gt 0 ]。
- 括号前后必须加空格,比如
- 举个标准用法的例子:
# 判断变量非空且数字大于10 if [ -n "$INPUT" ] && [ "$INPUT" -gt 10 ]; then echo "输入符合要求" fi
再聊聊[[(Bash扩展写法)
- 仅限进阶Shell:这是Bash、Zsh、Ksh这些现代Shell才有的扩展语法,不兼容POSIX标准,如果你的脚本要跑在各种小众/老Shell上,千万别碰它。
- 用起来更省心:
- 括号前后的空格要求没那么苛刻(虽然还是建议加,保持代码可读性);
- 变量不用强制加双引号,Shell会自动处理空格和特殊字符;
- 支持在括号里直接用
&&/||写逻辑组合,不用拆成多个条件; - 还支持模式匹配(用
==)和正则匹配(用=~),这是[完全做不到的。
- 举个Bash下的例子:
# 判断变量是小写字母开头,且数字大于10 if [[ $INPUT =~ ^[a-z].* && $INPUT -gt 10 ]]; then echo "输入符合要求" fi # 模式匹配判断文件后缀 if [[ $FILE == *.txt ]]; then echo "这是文本文件" fi
最后给个选择建议
- 如果追求绝对可移植性,比如脚本要在服务器、嵌入式设备的各种Shell上运行,老老实实选
[,严格遵守POSIX规则; - 如果只在Bash(或兼容的现代Shell)环境下跑,
[[能让代码更简洁、可读性更高,还能避开不少[的语法陷阱。
内容的提问来源于stack exchange,提问作者SaffronSalt
相关产品推荐
相关产品推荐

