Toc
  1. 文件比较运算符
  2. 字符串比较运算符
  3. 算术比较运算符
  4. 多重条件判定
Toc
0 results found
Bash 中的条件表达式
2013/01/22 Development Linux Bash

每种语言都会有条件表达式,在 Linux 下的 Bash 中也不例外。

这篇文章来详细讲一下 bash 中的条件表达式的运用。

在 Bash 中,基本可以分为两类,一类是使用 test 命令,另一种是使用 "[]" 表达式。这两种方式的功能是等价的。

在 Bash 中,要注意,不要把写其他语言的习惯带到这儿来,因为 Bash 是通过解释来直接执行命令的,不需要编译过程,所以为了规避一些可能出现的问题,在 "[]" 中间,每个元素都必须用空格隔开。比如:

[-e /home/tom]
[$num -eq 2]
["$string" = "You are a genius!"]    // 注意,等号两边须发有空格
["$p" != "sss"] || ["$p" != "ttt"]    // 同样地,"!=" 两边也必须有空格

如果写成这样:

[-e /home/tom]
[$num -eq 2]
["$string"="You are a genius!"]  // [ ] 运算符将 "$string"="You are a genius!" 视为一个整体了
["$p"!="sss"]||["$p"!="ttt"]

是无法正确执行的。

下面看几个运行符。

文件比较运算符

[-e filename] 如果 filename 存在, 则为真

[-e /var/log/syslog]
    or
test -e /var/log/syslog

[-d filename] 如果 filename 为目录, 则为真

[-d /tmp/mydir]
    or
test -d /tmp/mydir

[-f filename] 如果 filename 为常规文件, 则为真

[-f /usr/bin/httpd]
    or
test -f /usr/bin/httpd

[-L filename] 如果 filename 为符号链接, 则为真

[-L /usr/bin/apache2]
    or
test -L /usr/bin/apache2

[-r filename] 如果 filename 可读, 则为真

[-r /var/log/syslog]
    or
test -r /var/log/syslog

[-w filename] 如果 filename 可写, 则为真

[-w /var/haha.txt]
    or
test -w /var/haha.txt

[-x filename] 如果 filename 可执行, 则为真

[-x /etc/init.d/mysqld]
    or
test -x /etc/init.d/mysqld

[filename1 -nt filename2] 如果 filename1 比 filename2 新, 则为真

[/tmp/install/etc/services -nt /etc/services]   // newer than
    or
test /tmp/install/etc/services -nt /etc/services

[filename1 -ot filename2] 如果 filename1 比 filename2 旧, 则为真

[/home/tom/test -ot /home/tom/test1]    // older than
    or
test /home/tom/test -ot /home/tom/test1

[filename1 -ef filename2] 判断 filename1 与 filename2 是否为同一文件,可用在 hard link 的判定上。主要意义在于判定两个文件是否均指向同一个 inode。

[/usr/bin/apache2 -ef /etc/bin/apache2]    // equal file
    or
test /usr/bin/apache2 -ef /etc/bin/apache2

字符串比较运算符

(请注意引号的使用,这是防止空格扰乱代码的好方法)

[-z string] 如果 string 长度为零, 则为真

[-z "$myvar"]
    or
test -z "$myvar"

[-n string] 如果 string 长度非零, 则为真

[-n "$myvar"]  // -n 也可以省略
    or
test -n "$myvar"

[string1 = string2] 如果 string1 与 string2 相同, 则为真

["$myvar" = "one two three"]    // "==" 也是可以的,在 bash 中,进行判断时,"=" 和 "==" 的功能是相同的, 这一点跟编程语言中不太相同
                                  // 但为了区别开来,还是建议用 "=="
    or
test "$myvar" = "one two three"

[string1 != string2] 如果 string1 与 string2 不同, 则为真

["$myvar" != "one two three"]
    or
test "$myvar" != "one two three"

算术比较运算符

[num1 -eq num2] 等于

[$mynum -eq 3]    // equal
    or
test $mynum -eq 3

[num1 -ne num2] 不等于

[$mynum -ne 3]    // not equal
    or
test $mynum -ne 3

[num1 -lt num2] 小于

[$mynum -lt 3]    // less than
    or
test $mynum -lt 3

[num1 -le num2] 小于或等于

[$mynum -le 3]    // less or equal
    or
test mynum -le 3

[num1 -gt num2] 大于

[$mynum -gt 3]    // greater than
    or
test $mynum -gt 3

[num1 -ge num2] 大于或等于

[$mynum -ge 3]    // greater or equal
    or
test $mynum -ge 3

多重条件判定

-a 两个条件同时成立,则为真

[-r /home/tom/test -a -x /home/tom/test]    // 即 test 文件同时具有 rx 权限时,才返回真
    or
test -r /home/tom/test -a -x /home/tom/test 

-o 任意一个条件成立,则为真

[-r /home/tom/test -o -x /home/tom/test]    // 即 test 文件具有 r 或 x 权限时,都返回真
    or
test -r /home/tom/test -o -x /home/tom/test 

! 条件不成立,则为真

[! -x /home/tom/test]    // 即 test 文件同时不具有 x 权限时,才返回真
    or
test ! -x /home/tom/test 
打赏
支付宝
微信
本文作者:CodingRabbit
版权声明:本文首发于CodingRabbit的博客,转载请注明出处!