首页 > 代码库 > bash 脚本 文件测试操作与二元操作符

bash 脚本 文件测试操作与二元操作符

-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)

 

 

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

 

整数比较

 

-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" ],与=等价

                        注意:==的功能在[[]]和[]中的行为是不同的,如下:

                        1 [[ $a == z* ]]    # 如果$a以"z"开头(模式匹配)那么将为true

                        2 [[ $a == "z*" ]]  # 如果$a等于z*(字符匹配),那么结果为true

                        3

                        4 [ $a == z* ]      # File globbing 和word splitting将会发生

                        5 [ "$a" == "z*" ]  # 如果$a等于z*(字符匹配),那么结果为true

                        一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.

                        但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

!=                     不等于,如:if [ "$a" != "$b" ]

                        这个操作符将在[[]]结构中使用模式匹配.

<                      小于,在ASCII字母顺序下.如:

                        if [[ "$a" < "$b" ]]

                        if [ "$a" \< "$b" ]

                        注意:在[]结构中"<"需要被转义.

>                      大于,在ASCII字母顺序下.如:

                        if [[ "$a" > "$b" ]]

                        if [ "$a" \> "$b" ]

                        注意:在[]结构中">"需要被转义.

                        具体参考Example 26-11来查看这个操作符应用的例子.

-z                     字符串为"null".就是长度为0.

-n                     字符串不为"null"

                        注意:

                        使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z

                        或者就是未用""引用的字符串本身,放到[]结构中(见Example 7-6)虽然一般情况下可

                        以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.[1]

 

bash 脚本 文件测试操作与二元操作符