目录
当前位置: 首页 > 文档资料 > Shell 中文文档 >

7.2. 文件测试操作符

优质
小牛编辑
122浏览
2023-12-01

如果下面的条件成立返回真...

-e

文件存在

-a

文件存在

这个和-e的作用一样. 它是不赞成使用的,所以它的用处不大。

-f

文件是一个普通文件(不是一个目录或是一个设备文件)

-s

文件大小不为零

-d

文件是一个目录

-b

文件是一个块设备(软盘, 光驱, 等等.)

-c

文件是一个字符设备(键盘, 调制解调器, 声卡, 等等.)

-p

文件是一个管道

-h

文件是一个符号链接

-L

文件是一个符号链接

-S

文件是一个socket

-t

文件(描述符)与一个终端设备相关

这个测试选项可以用于检查脚本中是否标准输入 ([ -t 0 ])或标准输出([ -t 1 ])是一个终端.

-r

文件是否可读 (指运行这个测试命令的用户的读权限)

-w

文件是否可写 (指运行这个测试命令的用户的读权限)

-x

文件是否可执行 (指运行这个测试命令的用户的读权限)

-g

文件或目录的设置-组-ID(sgid)标记被设置

如果一个目录的sgid标志被设置,在这个目录下创建的文件都属于拥有此目录的用户组,而不必是创建文件的用户所属的组。这个特性对在一个工作组里的同享目录很有用处。

-u

文件的设置-用户-ID(suid)标志被设置

一个root用户拥有的二进制执行文件如果设置了设置-用户-ID位(suid)标志普通用户可以以root权限运行。

例子 7-4. 测试断掉的连接

   1 #!/bin/bash
   2 # broken-link.sh
   3 # 由Lee bigelow所写<ligelowbee@yahoo.com>
   4 # 已经征得作者的同意.
   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 #Setup the function linkchk to check the directory it is passed
  29 #for files that are links and don't exist, then print them quoted.
  30 #If one of the elements in the directory is a subdirectory then
  31 #send that send that subdirectory to the linkcheck function.
  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.
  38     done
  39 }
  40
  41 #Send each arg that was passed to the script to the linkchk function
  42 #if it is a valid directoy.  If not, then print the error message
  43 #and usage info.
  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

例子 28-1, 例子 10-7, 例子 10-3, 例子 28-3, 和 例子 A-1也说明了文件测试操作符的用法.

[1]

一定要意识到suid二进制文件可能引起潜在的安全漏洞,并且在shell脚本中suid标志已经不起作用了。

[2]

在现代UNIX操作系统,粘住位已经不在文件中再使用,只用在目录中。