Alex_McAvoy

想要成为渔夫的猎手

Shell 测试命令与条件表达式

【test 命令】

命令与结果显示

当需要检测系统中某些文件或属性时,使用 test 命令可以告诉我们相关结果

例如:判断 ~/test 是否存在

可以发现,该命令执行结果并不会显示任何信息,要想获取结果信息,需要通过使用 $?&&|| 来显示

即想要进行结果显示时,其语法如下:

1
2
3
4
# 使用$?来获取test命令返回值
test ...; echo $?
# 根据test命令返回值输出测试结果
test ... && echo "测试结果为true的显示信息" || echo "测试结果为false的显示信息"

判断文件类型

test 命令可用于某个文件或目录的文件存在与文件类型判断,其命令格式为:test [选项] filename

此时选项如下:

  • -e:filename 是否存在
  • -f:filename 是否存在且为文件
  • -d:filename 是否存在且为目录
  • -b:filename 是否存在且为 block device 设备
  • -c:filename 是否存在且为 character device 设备
  • -S:filename 是否存在且为 socket 文件
  • -p:filename 是否存在且为 FIFO 文件
  • -L:filename 是否存在且为连接文件
  • -s:filename 是否存在且为非空白文件

文件权限检测

test 命令还可用于文件权限检测,其命令格式为:test [选项] filename

此时选项如下:

  • -r:filename 是否存在且具有可读权限
  • -w:filename 是否存在且具有可写权限
  • -x:filename 是否存在且具有可执行权限
  • -u:filename 是否存在且具有 SUID 属性
  • -g:filename 是否存在且具有 SGID 属性
  • -k:filename 是否存在且具有 sticky bit 属性

文件比较

test 命令还可用于两个文件之间的比较,其命令格式为:test file1 [选项] file2

此时选项如下:

  • -nt:判断 file1 是否比 file2 (newer than)
  • -ot:判断 file1 是否比 file2 (older than)
  • -ef:判断 file1 与 file2 是否为同一文件,常用于硬连接的判断,即两个文件是否指向同一个 inode(equal file)

整数判定

test 命令还可用于判定两个整数,其命令格式为:test n1 [选项] n2

此时选项如下:

  • -eq:判断 n1 与 n2 是否相等(equal)
  • -ne:判断 n1 与 n2 是否不等(not equal)
  • -gt:判断 n1 是否大于 n2(greater than)
  • -lt:判断 n1 是否小于 n2(less than)
  • -ge:判断 n1 是否大于等于 n2(greater than or equal)
  • -le:判断 n1 是否小于等于 n2(less than or equal)

字符串数据判定

test 命令还可用于判定字符串数据,其命令格式如下:

  • test -z str:判断 str 是否为空串
  • test -n str:判断 str 是否为非空串
  • test str1=str:判断 str1 是否等于 str2
  • test str1!=str2:判断 str1 是否不等于 str2

多重条件判定

当需要使用 test 命令使用多重条件判定时,可采用如下选项:

  • -a:两个条件同时成立,例如 test -r file -a -x file,当 file 同时具有 r、x 权限时返回 true
  • -o:任何一个条件成立,例如 test -r file -o -x file,当 file 具有 r 或 x 权限时返回 true
  • !:条件取反,例如 test ! -r file,当 file 不具有 r 权限时返回 true

【条件表达式】

test 命令中,test 后跟的选项、文件名等统称为条件表达式

对于条件表达式来说,除了使用 test 命令进行测试外,还可以利用判断符号 [] 来进行判断

例如:判断 ~/test 是否存在且为目录

对于 [] 来说,需要注意的有:

  • 为区分通配符、正则表达式等,[] 内的左右两端需要使用 [Space] 来分隔
  • [] 内每个组件都需要使用 [Space] 来分隔
  • [] 内的变量最好都使用 "" 括起来
  • [] 内的常量最好都使用 '' 括起来
  • 判断选项与 test 命令判断选项相同
感谢您对我的支持,让我继续努力分享有用的技术与知识点!