6.4 Bash 条件表达式(Bash Conditional Expressions)

条件表达式是用于复合命令“[[”和内建命令“[”和“test”的。“test”和“[”命令由其参数个数决定了其行为;有关任何其它特定于该命令的操作,可参见这些命令的描述。

表达式可以是一元的,也可以是二元的,其由下面的基本元素组成。一元表达式一般用于检查文件的状态。也有一些字符串操作符和数字比较操作符。一些文件名用于表达式中时,Bash 会对它们进行特殊处理。如果 Bash 运行的操作系统提供这些特殊文件,Bash 会使用它们;否则,其会在内部模拟这些文件的行为:如果一个基本元素“file”参数的格式是“/dev/fd/N”,则会对文件描述符 N 进行检查。如果一个基本元素“file”参数的格式是“/dev/stdin”、“/de/vstdout”或“/dev/stderr”其中之一,则会分别对文件描述符 0、1 或 2 进行检查。

当使用“[[”时,“<”和“>”操作符会使用当前区域语言的字典顺序进行排序。“test”命令则使用 ASCII 顺序。

除非有其它指示,如果基本元素中的文件是软链接的话,对其操作会直接操作到链接的目标文件上,而不是链接本身。

操作符描述
-a file如果文件存在,则为真。
-b file如果文件存在并且是一个特殊块文件,则为真。
-c file如果文件存在并且是一个特殊字符文件,则为真。
-d file如果文件存在并且是一个目录,则为真。
-e file如果文件存在,则为真。
-f file如果文件存在并且是一个常规文件,则为真。
-g file如果文件存在并且设置了其“set-group-id”位,则为真。
-h file如果文件存在并且是一个软链接,则为真。
-k file如果文件存在并且设置了其“sticky”位,则为真。
-p file如果文件存在并且是一个命名管道(FIFO),则为真。
-r file如果文件存在并且可读,则为真。
-s file如果文件存在并且其大小大于 0,则为真。
-t fd如果文件描述符fd是打开的并且引用到一个终端上,则为真。
-u file如果文件存在并且其设置了其“set-user-id”位,则为真。
-w file如果文件存在并且可写入,则为真。
-x file如果文件存在并且可执行,则为真。
-G file如果文件存在并且其具有有效组 ID,则为真。
-L file如果文件存在并且是一个软链接,则为真。
-N file如果文件存在并且从其最后一次读取后修改过,则为真。
-O file如果文件存在并且其具有有效用户 ID,则为真。
-S file如果文件存在并且是一个套接层,则为真。
file1 -ef file2如果“file1”和“file2”引用到相同的设备和索引点数字时,则为真。
file1 -nt file2如果“file1”比“file2”更新(参考的是修改日期),或“file1”存在而“file2”不存在,则为真。
file1 -ot file2如果“file1”比“file2”更旧,或“file1”不存在而“file2”存在,则为真。
-o optname如果 shell 选项“optname”处于开启状态,则为真。可用的选项列表是内建命令 set 的“-o”选项提供的列表(参见 4.3.1《内建命令 set》)。
-v vername如果设置了 shell 变量“varname”(即分配了值),则为真。
-R varname如果设置了 shell 变量“varname”并且是一个名称引用变量,则为真。
-z string如果字符串“string”的长度是 0,则为真。
-n string
string
如果字符串“string”的长度不为 0,则为真。
string1 == string2
string1 = string2
如果两个字符串相等,则为真。当使用“[[”命令时,该形式的比较则进行样式匹配。可参见 3.2.5.2《条件结构》中的描述。在 test 命令中使用“=”是和 POSIX 保持一致。
string1 != string2如果两个字符串不相等,则为真。
string1 < string2如果“string1”的字典排序小于“string2”,则为真。
string1 > string2如果“string1”的字典排序大于“string2”,则为真。
arg1 OP arg2OP 是操作符“-eq”、“-ne”、“-lt”、“-le”、“-gt”或“-ge”中的一个。如果“arg1”分别等于、不等于、小于、小于等于、大于、或大于等于“arg2”时,这些算术二元操作符会返回真。“arg1”和“arg2”可以是正数,也可以是负数。当使用“[[”命令时,“arg1”和“arg2”会作为算术表达式进行运算(参见 6.5《Shell 算术运算》)。