在 shell
脚本判断逻辑中的一些操作符
一、字符串测试#
选项 | 含义 | 示例 | 说明 |
---|
-z | 字符串为空 | [ -z "$str" ] | 变量未定义或值为空时为真 |
-n | 字符串非空 | [ -n "$str" ] | 变量已定义且值不为空时为真 |
重要提示:变量必须用双引号包裹,避免未定义变量导致语法错误:
# 错误写法(未定义变量会报错)
[ -n $var ]
# 正确写法
[ -n "$var" ]
二、文件测试#
文件存在性测试#
选项 | 含义 | 示例 |
---|
-e | 文件/目录存在 | [ -e "/path" ] |
-a | 同 -e (已废弃) | 不推荐使用 |
文件类型测试#
选项 | 含义 | 示例 |
---|
-f | 常规文件 | [ -f file.txt ] |
-d | 目录 | [ -d "/dir" ] |
-L | 符号链接 | [ -L link ] |
-h | 同 -L | [ -h link ] |
-b | 块设备 | [ -b /dev/sda ] |
-c | 字符设备 | [ -c /dev/tty ] |
-p | 命名管道 | [ -p pipe ] |
-S | 套接字 | [ -S socket ] |
权限测试#
选项 | 含义 | 示例 |
---|
-r | 可读 | [ -r file ] |
-w | 可写 | [ -w file ] |
-x | 可执行 | [ -x script.sh ] |
-g | 设置了 setgid | [ -g file ] |
-u | 设置了 setuid | [ -u file ] |
-k | 设置了 sticky bit | [ -k /tmp ] |
文件属性测试#
选项 | 含义 | 示例 |
---|
-s | 文件非空 | [ -s data.log ] |
-N | 修改后未读取 | [ -N file ] |
-O | 当前用户拥有 | [ -O file ] |
-G | 当前用户组拥有 | [ -G file ] |
文件比较测试#
选项 | 含义 | 示例 |
---|
-nt | 文件1比文件2新 | [ file1 -nt file2 ] |
-ot | 文件1比文件2旧 | [ file1 -ot file2 ] |
-ef | 相同设备/Inode | [ file1 -ef file2 ] |
三、数值比较#
选项 | 含义 | 示例 | 等价算术符 |
---|
-eq | 等于 | [ $a -eq 5 ] | == |
-ne | 不等于 | [ $a -ne 5 ] | != |
-gt | 大于 | [ $a -gt 5 ] | > |
-ge | 大于等于 | [ $a -ge 5 ] | >= |
-lt | 小于 | [ $a -lt 5 ] | < |
-le | 小于等于 | [ $a -le 5 ] | <= |
四、组合逻辑#
选项 | 含义 | 示例 |
---|
! | 逻辑非 | [ ! -f file ] |
-a | 逻辑与 | [ -f file -a -r file ] |
-o | 逻辑或 | [ -d dir -o -L dir ] |
现代写法(推荐):
# 使用 && 和 || 代替 -a/-o
[ -f file ] && [ -r file ] # 与
[ -d dir ] || [ -L dir ] # 或
五、终端测试#
选项 | 含义 | 示例 |
---|
-t [fd] | 文件描述符是否关联终端 | [ -t 0 ] 检查 stdin 是否来自终端 |
六、特殊符号扩展#
变量存在性测试#
语法 | 含义 | 示例 |
---|
${var:-default} | 空则用默认值 | name=${NAME:-"Unknown"} |
${var:=default} | 空则赋值并用默认值 | : ${PATH:=/bin} |
${var:+alt} | 非空则用替代值 | echo ${DEBUG:+"Debug Mode"} |
${var:?error} | 空则报错退出 | : ${API_KEY:?"Need API key"} |
变量长度测试#
[ ${#var} -gt 10 ] # 检查变量长度是否大于10