test
判断某需求是否满足,一般做条件判断,搭配 if 和三元表达式使用。
若真,则状态码$?返回0
若假,则状态码$?返回 1
test 命令也可以简写为[]
1 | test 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 当前有效用户是否为文件属主
1 | lujinkai@Z510:/home/ljk$ ll ./ljk.log |
- -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