TOC

Linux 检查表达式

确切的说 [ 是 Shell 内建命令,和 test 是一个意思(可能就是一个别名)。

我怀疑是 Shell 扩张,吞并了一个叫做 [test 的程序,我似乎记得之前什么时候使用的 Linux 有一个叫做 [ 程序。

man [man test 可以看到其详细的用法。

我们用的多的是:

# 路径存在?
if [ -e "$x" ]; then echo $x; fi
# 路径存在且是文件?
if [ -f "$x" ]; then echo $x; fi
# 路径存在且是目录?
if [ -d "$x" ]; then echo $x; fi

# 空字符串?
if [ -z "$x" ]; then echo $x; fi
# 非空字符串?
if [ -z "$x" ]; then echo $x; fi

# 字符串比较
if [ "$x" = "$y" ]; then echo $x; fi
if [ "$x" != "$y" ]; then echo $x; fi

[[ 关键字

[[ 不同于 [,首先不是命令,而是 POSIX Shell 规范中定义的一个关键字,也没那么历史悠久(与 Unix 同寿)。

按我的理解,就是对 [ 的拓展,最重要的就是加入其他程序设计语言中常见的逻辑运算符:

  • && 与,对应 [ 命令的 -a 参数
  • || 或,对应 [ 命令的 -o 参数
  • !
  • () 分组

来自 bash 的资料(help [[):

[[ ... ]]: [[ 表达式 ]]
    执行条件命令。

    根据条件表达式 EXPRESSION 的估值返回状态0或1。表达式按照
    `test' 内建的相同条件组成,或者可以有下列操作符连接而成:

      ( EXPRESSION )    返回 EXPRESSION 表达式的值
      ! EXPRESSION      如果 EXPRESSION表达式为假则为真,否则为假
      EXPR1 && EXPR2    如果 EXPR1 和 EXPR2 表达式均为真则为真,否则为假
      EXPR1 || EXPR2    如果 EXPR1 和 EXPR2 表达式中有一个为真则为真,否则为假

    当使用 `==' 和 `!=' 操作符时,操作符右边的字符串被用作模式并且执行一个
    匹配。当使用 `=~' 操作符时,操作符右边的字符串被当作正则表达式来进行
    匹配。

    操作符 && 和 || 将不对 EXPR2 表达式进行估值,如果 EXPR1 表达式足够确定
    整个表达式的值。

    退出状态:
    根据 EXPRESSION 的值为0或1。

此外,还查到这么个用法:

x="abcd"
if [[ "$x" = ab* ]]; then echo $x; fi
if [[ "$x" = *cd ]]; then echo $x; fi

判断字符串是否以某字符串开头或结尾,相当于 Python 中的 str.startswithstr.endswith