专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>高级Bash脚本编程指南>

7.2 文件测试操作

百度收藏 QQ搜藏

----------------
返回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了,只在目录中使用.

上一篇:7.1 Test结构 下一篇:7.3 其他比较操作

power by soyo123 2007-2008