确切的说 [
是 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.startswith
和 str.endswith
。