傻瓜学Bash - Test及相关的比较操作

阅读更多

  

   一个if/then 结构可以测试命令的返回值是否为0(因为0 表示成功),如果是的话,执行更多命令.

有一个专用命令"["(左中括号,特殊字符).这个命令与test 命令等价,但是出于效率上的考虑,

它是一个内建命令.这个命令把它的参数作为比较表达式或是文件测试,并且根据比较的结果,

返回一个退出码.  

  ((...))和let...结果也能够返回一个退出码,当它们所测试的算术表达式的结果为非0 的时候,

他们的退出码将返回0.

  例如: 

  let "1<2" returns 0 (as "1<2" expands to "1")

  if 命令可以测试任何命令,不仅仅是括号中的条件. 例如:

  word=Linux

  letter_sequence=inu

  if echo "$word" | grep -q "$letter_sequence"

   # "-q"选项是用来阻止输出

     then

     echo "$letter_sequence found in $word"

     else

     echo "$letter_sequence not found in $word"

  fi

  当然,if/else 可以嵌套。除了上述的测试结构,[[]]结构比Bash 的[]更加灵活,使用[[]],而不是[],能够阻止脚本中的许多逻辑错误.

  以下是一些常用的测试操作(from ABS Guide):

     -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 的目录

共享来说,这非常有用.见<>第58 页.

     -u set-user-id(suid)标志到文件上,如果运行一个具有 root 权限的文件,那么运行进程将取得root 权限,即使你是一个普通,用户.[1]这对于需要存取系统硬件的执行操作(比如pppd 和cdrecord)非常有用.如果,没有 suid 标志的话,那么普通用户(没有root 权限)将无法运行这种程序.见<>第58 页.

                -rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppd

                 对于设置了 suid 的文件,在它的权限标志中有"s".

     -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" ],与=等价,注意:==的功能在[[]]和[]中的行为是不同的,如下:

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

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

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

                     [ "$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" ]

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

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

     -n 字符串不为"null", 注意:

         使用-n 在[]结构中测试必须要用""把变量引起来.

 

 

 

你可能感兴趣的:(bash,shell,测试,if/else,比较)