开发工具

Shell 单中括号[]

13 篇文章69 次收藏

在 Shell 脚本中,单中括号 [ ] 是一个内置命令(实际上是 test 命令的别名),主要用于 条件测试。以下是它的核心用法和示例:

1. 文件测试

检查文件属性(需在 [ ] 内留空格):

[ -f "/path/file.txt" ] && echo "File exists"    # 检查普通文件是否存在
[ -d "/path" ] && echo "Directory exists"       # 检查目录是否存在
[ -r file.txt ] && echo "File is readable"      # 检查可读性

常用文件测试符:

-e:文件存在

-s:文件非空

-w:可写

-x:可执行

-L:符号链接


2. 字符串比较

[ "$str" = "hello" ] && echo "String is hello"   # 字符串相等
[ "$str" != "hi" ] && echo "String is not hi"    # 字符串不等
[ -z "$str" ] && echo "String is empty"          # 检查空字符串
[ -n "$str" ] && echo "String is not empty"      # 检查非空字符串

注意:变量必须用双引号包裹(避免空值错误)。


3. 数值比较

[ 5 -gt 3 ] && echo "5 > 3"          # -gt(大于)
[ 2 -le 4 ] && echo "2 <= 4"         # -le(小于等于)
[ $num -eq 10 ] && echo "num is 10"  # -eq(等于)

数值比较运算符:

-eq:等于

-ne:不等于

-lt:小于

-ge:大于等于


4. 逻辑组合

[ -f file.txt -a -r file.txt ] && echo "File exists and is readable"  # -a(AND)
[ "$x" = "yes" -o "$y" = "yes" ] && echo "Either x or y is yes"       # -o(OR)
[ ! -d "/tmp" ] && echo "/tmp is NOT a directory"                     # !(NOT)

注意:现代脚本推荐使用 [[ ]] 的 && 和 || 替代 -a/-o(更安全)。


5. 命令返回值检查

[ $? -eq 0 ] && echo "Last command succeeded"  # 检查上条命令是否成功


注意事项

1、空格是必须的:

[ "$var" = "value" ]  # 正确
[$var = "value"]      # 错误(会报错)


2、变量引用加引号:

[ -f "$filename" ]    # 防止文件名含空格时出错


3、与 [[ ]] 的区别:

[ ] 是传统 POSIX 兼容语法,功能有限。
[[ ]] 是 Bash/Zsh 扩展,支持更强大的模式匹配(如 == 通配符)且无需引号。
[[ $str == h* ]] && echo "Starts with h"  # 仅在 [[ ]] 中支持通配符


常见错误示例

[ $var = "hello" ]     # 若 $var 为空,等价于 [ = "hello" ] → 语法错误
[ "$var" = "hello" ]   # 正确写法


总结表

测试类型示例说明
文件测试[ -f file ]检查普通文件
字符串比较[ "$s" = "str" ]相等性判断
数值比较[ $n -lt 5 ]数字大小比较
逻辑组合[ cond1 -a cond2 ]AND/OR/NOT 组合
命令返回值[ $? -ne 0 ]检查上条命令是否失败

单中括号 [ ] 是 Shell 条件测试的基础工具,但在 Bash 中更推荐使用 [[ ]](避免许多边界问题)。