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