test

本文最后更新于:2023年12月5日 晚上

判断某需求是否满足,一般做条件判断,搭配 if 和三元表达式使用。
若真,则状态码$?返回0
若假,则状态码$?返回 1

test 命令也可以简写为[]

test expression
# 或
[ expression ]

在 test 中使用变量建议使用双引号包裹

test 和[]都是命令,一个命令本质上对应一个程序或者一个函数。即使是一个程序,它也有入口函数,所以也可以将一个程序等效为一个函数,这样我们就不用在区分函数和程序了,直接讲一个命令和一个函数对应起来。

所以,使用一个命令实际上就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。参数”“和不传参是不一样的,所以,变量应该用双引号包裹起来,这样能避免变量为空时导致的很多奇葩问题。

与数值比较相关的 test 选项

  • -eq 等于
  • =和== 两者是一样的
  • -ne 不等于
  • != 等同与-ne
  • -gt 大于
  • -\> 判断 ascii
  • -lt 小于
  • -\< 判断 ascii
  • -ge 大于等于
  • -le 小于等于

变量测试

  • -v FILE 小写 v,判断变量是否定义
  • -R FILE 判断变量是否定义并且是名称引用,bash4.4 新特性,这个说实话看不懂

文件测试

存在性测试

  • -a FILE 同-e
  • -e FILE 文件是否存在,存在返回 0
  • -b FILE 文件是否存在且为块设备文件
  • -c FILE 文件是否存在且为字符设备文件
  • -d FILE 文件是否存在且为目录文件
  • -f FILE 文件是否存在且为普通文件
  • -h FILE 同-L
  • -L FILE 文件是否存在且为符号链接文件
  • -p FILE 文件是否存在且为命名管道文件
  • -S FILE 文件是否存在且为套接字文件

文件权限测试

  • -r FILE 文件是否存在且可读
  • -w FILE 文件是否存在且可写
  • -x FILE 文件是否存在且可执行
  • -u FILE 文件是否存在且拥有 suid 权限
    如果 bin 文件设置了 SUID,那么当前用户执行这个 bin 文件的时候,会自动继承这个 bin 文件的属主的身份。
  • -g FILE 文件是否存在且拥有 guid 权限
  • -k FILE 是否存在且拥有 sticky 权限
    当目录设置了 Sticky 权限,只有文件的所有者和 root 可以删除该文件。

文件属性测试

  • -s FILE 文件是否存在且非空
  • -t fd 文件描述符是否在某终端已经打开
    fd 是文件描述符,或者说句柄,open 打开一个文件,就返回一个文件描述符 fd,fd 就指向这个打开的文件,使用 close(fd)关闭。linux 默认最多打开 1024 个文件,显然不够用,可以通过设置 ulimit 来调整。
  • -N FILE 文件自从上一次被读取后是否被修改
  • -O FILE 当前有效用户是否为文件属主
lujinkai@Z510:/home/ljk$ ll ./ljk.log
-rw-rw-r-- 1 ljk ljk 8 Aug  9 17:57 ./ljk.log
lujinkai@Z510:/home/ljk$ [ -O ljk.log ]
lujinkai@Z510:/home/ljk$ echo $?
1
lujinkai@Z510:/home/ljk$ cd ~/data/test/
lujinkai@Z510:~/data/test$ ll test.sh
-rw-r--r-- 1 lujinkai lujinkai 36 Aug  8 22:38 test.sh
lujinkai@Z510:~/data/test$ [ -O test.sh ]
lujinkai@Z510:~/data/test$ echo $?
0
  • -G FILE 当前有效用户是否为文件数组
  • FILE1 -ef FILE2 FILE1 是否是 FILE2 的硬链接
  • FILE1 -nt FILE2 FILE1 是否新于 FILE2(mtime)
  • FILE1 -ot FILE2 FILE1 是否旧于 FILE2

字符串测试

  • -z 判断字符串是否为空,为空返回 0

  • -n 判断字符串是否为非空,非空返回 0,-n 可以省略,test string等同于test -n string

逻辑运算

  • -a 逻辑与
  • -o 逻辑或

for i in 遍历后 $i 还存在,需要手动删除 unset i


test
http://blog.lujinkai.cn/运维/基础/shell脚本编程/test/
作者
像方便面一样的男子
发布于
2020年12月9日
更新于
2023年12月5日
许可协议