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 arg2 | OP 是操作符“-eq”、“-ne”、“-lt”、“-le”、“-gt”或“-ge”中的一个。如果“arg1”分别等于、不等于、小于、小于等于、大于、或大于等于“arg2”时,这些算术二元操作符会返回真。“arg1”和“arg2”可以是正数,也可以是负数。当使用“[[”命令时,“arg1”和“arg2”会作为算术表达式进行运算(参见 6.5《Shell 算术运算》)。 |