---------------- 返回true如果...
-e 文件存在 -a 文件存在 这个选项的效果与-e相同.但是它已经被弃用了,并且不鼓励使用 -f file是一个regular文件(不是目录或者设备文件) -s 文件长度不为0 -d 文件是个目录 -b 文件是个块设备(软盘,cdrom等等) -c 文件是个字符设备(键盘,modem,声卡等等) -p 文件是个管道 -h 文件是个符号链接 -L 文件是个符号链接 -S 文件是个socket -t 关联到一个终端设备的文件描述符 这个选项一般都用来检测是否在一个给定脚本中的stdin[-t0]或[-t1]是一个终端 -r 文件具有读权限(对于用户运行这个test) -w 文件具有写权限(对于用户运行这个test) -x 文件具有执行权限(对于用户运行这个test) -g set-group-id(sgid)标志到文件或目录上 如果一个目录具有sgid标志,那么一个被创建在这个目录里的文件,这个目录属于创建 这个目录的用户组,并不一定与创建这个文件的用户的组相同.对于workgroup的目录 共享来说,这非常有用.见<<UNIX环境高级编程中文版>>第58页. -u set-user-id(suid)标志到文件上 如果运行一个具有root权限的文件,那么运行进程将取得root权限,即使你是一个普通 用户.[1]这对于需要存取系统硬件的执行操作(比如pppd和cdrecord)非常有用.如果 没有suid标志的话,那么普通用户(没有root权限)将无法运行这种程序. 见<<UNIX环境高级编程中文版>>第58页. -rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppd 对于设置了suid的文件,在它的权限标志中有"s". -k 设置粘贴位,见<<UNIX环境高级编程中文版>>第65页. 对于"sticky bit",save-text-mode标志是一个文件权限的特殊类型.如果设置了这 个标志,那么这个文件将被保存在交换区,为了达到快速存取的目的.如果设置在目录 中,它将限制写权限.对于设置了sticky bit位的文件或目录,权限标志中有"t". drwxrwxrwt 7 root 1024 May 19 21:26 tmp/ 如果一个用户并不时具有stick bit位的目录的拥有者,但是具有写权限,那么用户只 能在这个目录下删除自己所拥有的文件.这将防止用户在一个公开的目录中不慎覆盖 或者删除别人的文件,比如/tmp(当然root或者是目录的所有者可以随便删除或重命名 其中的文件). -O 你是文件的所有者. -G 文件的group-id和你的相同. -N 从文件最后被阅读到现在,是否被修改.
f1 -nt f2 文件f1比f2新 f1 -ot f2 f1比f2老 f1 -ef f2 f1和f2都硬连接到同一个文件.
! 非--反转上边测试的结果(如果条件缺席,将返回true)
Example 7-4 test死的链接文件 ################################Start Script####################################### 1 #!/bin/bash 2 # broken-link.sh 3 # Written by Lee bigelow <ligelowbee@yahoo.com> 4 # Used with permission. 5 6 #一个真正有用的shell脚本来找出死链接文件并且输出它们的引用 7 #以便于它们可以被输入到xargs命令中进行处理 :) 8 #比如: broken-link.sh /somedir /someotherdir|xargs rm 9 # 10 #这里,不管怎么说,是一种更好的方法 11 # 12 #find "somedir" -type l -print0|\ 13 #xargs -r0 file|\ 14 #grep "broken symbolic"| 15 #sed -e 's/^\|: *broken symbolic.*$/"/g' 16 # 17 #但这不是一个纯粹的bash,最起码现在不是. 18 #小心:小心/proc文件系统和任何的循环链接文件. 19 ############################################################## 20 21 22 #如果没对这个脚本传递参数,那么就使用当前目录. 23 #否则就使用传递进来的参数作为目录来搜索. 24 # 25 #################### 26 [ $# -eq 0 ] && directorys=`pwd` || directorys=$@ 27 28 #建立函数linkchk来检查传进来的目录或文件是否是链接和是否存在, 29 #并且打印出它们的引用 30 #如果传进来的目录有子目录, 31 #那么把子目录也发送到linkchk函数中处理,就是递归目录. 32 ########## 33 linkchk () { 34 for element in $1/*; do 35 [ -h "$element" -a ! -e "$element" ] && echo \"$element\" 36 [ -d "$element" ] && linkchk $element 37 # Of course, '-h' tests for symbolic link, '-d' for directory. 37 # 当然'-h'是测试链接,'-d'是测试目录. 38 done 39 } 40 41 #如果是个可用目录,那就把每个从脚本传递进来的参数都送到linkche函数中. 42 #如果不是,那就打印出错误消息和使用信息. 43 # 44 ################ 45 for directory in $directorys; do 46 if [ -d $directory ] 47 then linkchk $directory 48 else 49 echo "$directory is not a directory" 50 echo "Usage: $0 dir1 dir2 ..." 51 fi 52 done 53 54 exit 0 ################################End Script######################################### Example 28-1, Example 10-7, Example 10-3, Example 28-3, 和Example A-1 也会说明文件 测试操作的使用过程.
注意事项: [1] 小心suid,可能引起安全漏洞,但是不会影响shell脚本. [2] 在当代UNIX系统中,已经不使用sticky bit了,只在目录中使用. |