当前位置:编程学习 > JAVA >>

文件测试操作符

如果下面的条件成立将会返回真.
-e
文件存在
-a
文件存在,这个选项的效果与-e相同. 但是它已经被"弃用"了, 并且不鼓励使用.
-f
表示这个文件是一个一般文件(并不是目录或者设备文件)
-s
文件大小不为零
-d
表示这是一个目录
-b
表示这是一个块设备(软盘, 光驱, 等等.)
-c
表示这是一个字符设备(键盘, modem, 声卡, 等等.)
-p
这个文件是一个管道
-h
这是一个符号链接
-L
这是一个符号链接
-S
表示这是一个socket
-t
文件(描述符)被关联到一个终端设备上,这个测试选项一般被用来检测脚本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是否来自于一个终端.
-r
文件是否具有可读权限(指的是正在运行这个测试命令的用户是否具有读权限)
-w
文件是否具有可写权限(指的是正在运行这个测试命令的用户是否具有写权限)
-x
文件是否具有可执行权限(指的是正在运行这个测试命令的用户是否具有可执行权限)
-g
set-group-id(sgid)标记被设置到文件或目录上,如果目录具有sgid标记的话, 那么在这个目录下所创建的文件将属于拥有这个目录的用户组, 而不必是创建这个文件的用户组. 这个特性对于在一个工作组易做图享目录非常有用.
-u

set-user-id (suid)标记被设置到文件上,如果一个root用户所拥有的二进制可执行文件设置了set-user-id标记位的话, 那么普通用户也会以root权限来运行这个文件. [1] 这对于需要访问系统硬件的执行程序(比如pppd和cdrecord)非常有用. 如果没有suid标志的话, 这些二进制执行程序是不能够被非root用户调用的.对于设置了suid标志的文件, 在它的权限列中将会以s表示.其实这个权限在最初说文件权限的文章中已经说过了,比较特殊的一种权限

-k
设置粘贴位,对于"粘贴位"的一般了解, save-text-mode标志是一个文件权限的特殊类型. 如果文件设置了这个标志, 那么这个文件将会被保存到缓存中, 这样可以提高访问速度. [2] 粘贴位如果设置在目录中, 那么它将限制写权限. 对于设置了粘贴位的文件或目录, 在它们的权限标记列中将会显示t.


-O
判断你是否是文件的拥有者
-G
文件的group-id是否与你的相同
-N
从文件上一次被读取到现在为止, 文件是否被修改过
f1 -nt f2
文件f1比文件f2新
f1 -ot f2
文件f1比文件f2旧
f1 -ef f2
文件f1和文件f2是相同文件的硬链接
!
"非" -- 反转上边所有测试的结果(如果没给出条件, 那么返回真).


这里只是先把一个实例贴在这里,暂且不做任何分析,因为现在去分析这个程序还有点为时尚早:


[cpp] view plaincopyprint?
#!/bin/bash  
#一个纯粹的shell脚本用来找出那些断掉的符号链接文件并且输出它们所指向的文件.  
#以便于它们可以把输出提供给xargs来进行处理 :)  
#比如. xxx.sh /somedir /someotherdir|xargs rm  
#下边的方法, 不管怎么说, 都是一种更好的办法:  
#find "somedir" -type l -print0|\  
#xargs -r0 file|\  
#grep "broken symbolic"|  
#sed -e 's/^\|: *broken symbolic.*$/"/g'  
#但这不是一个纯粹的bash脚本, 最起码现在不是.  
#注意: 谨防在/proc文件系统和任何死循环链接中使用!  
 
#如果没有参数被传递到脚本中, 那么就使用  
#当前目录. 否则就是用传递进来的参数作为目录  
#来搜索.  
[ $# -eq 0 ] && directorys=`pwd` || directorys=$@ 
 
#编写函数linkchk用来检查传递进来的目录或文件是否是链接,   
#并判断这些文件或目录是否存在. 然后打印它们所指向的文件.  
#如果传递进来的元素包含子目录,   
#那么把子目录也放到linkcheck函数中处理, 这样就达到了递归的目的.  
linkchk () { 
    for element in $1/*; do 
    [ -h "$element" -a ! -e "$element" ] && echo \"$element\" 
    [ -d "$element" ] && linkchk $element 
    # 当然, '-h'用来测试符号链接, '-d'用来测试目录.  
    done 

 
#把每个传递到脚本的参数都送到linkchk函数中进行处理,   
#检查是否有可用目录. 如果没有, 那么就打印错误消息和  
#使用信息.  
for directory in $directorys; do 
    if [ -d $directory ] 
        then linkchk $directory 
    else  
        echo "$directory is not a directory" 
        echo "Usage: $0 dir1 dir2 ..." 
    fi 
done 
exit 0 

#!/bin/bash
#一个纯粹的shell脚本用来找出那些断掉的符号链接文件并且输出它们所指向的文件.
#以便于它们可以把输出提供给xargs来进行处理 :)
#比如. xxx.sh /somedir /someotherdir|xargs rm
#下边的方法, 不管怎么说, 都是一种更好的办法:
#find "somedir" -type l -print0|\
#xargs -r0 file|\
#grep "broken symbolic"|
#sed -e 's/^\|: *broken symbolic.*$/"/g'
#但这不是一个纯粹的bash脚本, 最起码现在不是.
#注意: 谨防在/proc文件系统和任何死循环链接中使用!

#如果没有参数被传递到脚本中, 那么就使用
#当前目录. 否则就是用传递进来的参数作为目录
#来搜索.
[ $# -eq 0 ] && directorys=`pwd` || directorys=$@

#编写函数linkchk用来检查传递进来的目录或文件是否是链接,
#并判断这些文件或目录是否存在. 然后打印它们所指向的文件.
#如果传递进来的元素包含子目录,
#那么把子目录也放到linkcheck函数中处理, 这样就达到了递归的目的.
linkchk () {
 for element in $1/*; do
 [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
 [ -d "$element" ] && linkchk $element
 # 当然, '-h'用来测试符号链接, '-d'用来测试目录.
 done
}

#把每个传递到脚本的参数都送到linkchk函数中进行处理,
#检查是否有可用目录. 如果没有, 那么就打印错误消息和
#使用信息.
for directory in $directorys; do
 if [ -d $directory ]
  then linkchk $directory
 else
  echo "$directory is not a directory"
  echo "Usage: $0 dir1 dir2 ..."
 fi
done
exit 0
其他比较操作符
二元比较操作符用来比较两个变量或数字. 注意整数比较与字符串比较的区别.
整数比较

-eq
等于
if [ "$a" -eq "$b" ]

-ne
不等于
if [ "$a" -ne "$b" ]

-gt
大于
if [ "$a" -gt "$b" ]

-ge
大于等于
if [ "$a" -ge "$b" ]

-lt
小于
if [ "$a" -lt "$b" ]

-le
小于等于
if [ "$a" -le "$b" ]

<
小于(在双括号中使用)
(("$a" < "$b"))

<=
小于等于(在双括号中使用)
(("$a" <= "$b"))

>
大于(在双括号中使用)
(("$a" > "$b"))

>=
大于等于(在双括号中使用)
(("$a" >= "$b"))

字符串比较
=
等于
if [ "$a" = "$b" ]

==
等于
if [ "$a" == "$b" ]
与=等价,不过,==比较操作符在双中括号对和单中括号对中的行为是不同的.我们看看实例,理解一下:

[cpp] view plaincopyprint?
#!/bin/bash  
a=abcdef 
if [[ $a == ab* ]] 
then 
    echo "result1: true" 
else 
    echo "result1: false" 
fi 
 
if [[ $a == "ab*" ]] 
then 
    echo "result2: true" 
else 
    ec

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,