来自 Bash 手册
6.4 Bash 条件表达式
条件表达式由 [[ 复合命令以及 test 和 [ 内置命令使用。
表达式可以是一元的或二元的。一元表达式通常用于检查文件的状态。还有字符串运算符和数字比较运算符。如果文件参数为其中之一初选格式为 /dev/fd/N,则检查文件描述符 N。如果文件参数为其中之一初选 是 /dev/stdin、/dev/stdout 或 /dev/stderr 之一,分别检查文件描述符 0、1 或 2。
当与 [[ 一起使用时,“<”和“>”运算符使用当前区域设置按字典顺序排序。测试命令使用 ASCII 排序。
除非另有规定,初选 对文件进行操作的文件遵循符号链接并对链接的目标进行操作,而不是对链接本身进行操作。
初级的定义是什么?
主要和操作员或操作之间有什么区别?
答案1
如前所述,这是行话。这bash 参考手册没有定义该术语;假设读者知道这一点。
您可以轻松地发现它用于算术表达式中的操作数。参见示例算术表达式在一个Fortran 77 语言参考手册,其中说
主数是算术表达式中的基本组成部分。初级的形式如下:
无符号算术常量
算术常数的符号名称
算术变量引用
算术数组元素引用
算术函数参考
括号内的算术表达式
在 POSIX 中,它的使用(仍然)主要依赖于读者对该术语的先验知识。例如,在 shell 命令语言中,它指的是find
命令:
(例如,当使用 POSIX.1-2008 的系统接口卷中定义的 exec 函数之一调用 find 时,在 find - name Primary 的参数中,或者在 fnmatch() 函数的模式参数中),
以及阅读时那部分显然,原数与操作数的含义相同。也就是说,在命令解析的每个级别,命令(或主命令)都有一些进一步的主要因素需要考虑,直到剩下的都是常量或变量:又名“操作数”。
答案2
该术语的使用似乎含糊不清。似乎意味着
- 操作员,或
- 一个运算符,根据情况与一个或两个操作数组合以生成布尔值
参考:
这Bash 参考手册, 部分3.2.4.2 条件构造,谈论[[
…… ]]
,说,
…表达式由下面描述的原色组成Bash 条件表达式。 ……
这是您在问题中引用的有点令人困惑的部分。它继续列出,,, ……,,……,, ……,, ……, 等等。-a file
-b file
-t fd
file1 -ef file2
-z string
string1 != string2
和这test
命令的 POSIX 规范, 部分操作数
(感谢 BinaryZebra 识别该来源)说,
具有以下形式的两个元素的原选:
-primary_operator primary_operand
被称为一元初选。具有以下两种形式之一的三个元件的原选:
primary_operand -primary_operator primary_operand
primary_operand primary_operator primary_operand
被称为二元初选。 ……
所以,这两个来源似乎都同意、等是初选。但是,你是对的;当参考手册第 6.4 节谈到“-b file
-c file
文件一个初选的参数”,看起来它确实是指将运算符(例如,,,-b
…… -c
)作为初选。
答案3
简短回答(我的话):
测试中存在的“单词”([[
and ]]
、 or [
and ]
)在按空格分割后成为主词。单词可以是 ( !
)、( -f
) 或值 ( $var
)。如果第一个[
或[[
被理解为命令(“测试”),那么这些词也是“参数” 。
分裂后,(一些)两个词连在一起。像 (-f) 和 ($var) 一样被称为“一元原色”。而(有的)三个词被称为“二元初级”。
但这种描述在某些用途中并不那么精确,而且有点偏离。
更长的答案:
这个概念相当古老(源自 Bourne shell),并且POSIX 规范中有详细说明(作为示例):
操作数
应用程序应确保所有运营商和初选要素呈现为单独的论点到测试实用程序。
以下原色可用于构造表达式:
是表达表示大括号内的内容:[expression]
。
注意这里的操作数和运算符都是提供给测试实用程序的参数(按空格分隔的单词)。
表达式的概念也用在 中man bash
,例如,靠近开头,搜索[[ expression ]]
(“复合命令”的一种形式):
表达式由以下部分组成初选下面在条件表达式下进行了描述。
条件运算符(例如 -f)必须不加引号才能被识别为主运算符。
最终的
最后,您可以在上面链接的 POSIX 规范页面中搜索又在这里对于这一行(以及下面的行):
具有以下形式的两个元素的原语 称为:
-primary_operatorprimary_operand
一元初选。
以下几行尝试使用最多有 4 个参数的表达式来定义原色(单词由空格分隔,我从这里开始)。
没有 4 个单词的初选(如果!
不算作(否定的)三单词初选的一部分)。
该 POSIX 描述在许多极端情况下效果不佳,这是开发内置[[ ]]
.
答案4
从man bash
:
在本
Compound Commands
节中:表达式是组成的下面在条件表达式中描述的原选。 (1)
有条件的运营商例如 -f 必须不加引号才能被识别为初选。 (2)
可以使用以下运算符组合表达式 [...](继续列出:( )、!、&& 和 ||)[...] && 和 ||运营商不评估表达式2如果值表达式1足以确定的返回值整个条件表达式。 (3)
在本
CONDITIONAL EXPRESSIONS
节中:表达式是形成的来自以下一元或二元原色。 (4)
如果有的话文件参数初选之一 [...] (5)
除非另有说明,初选对文件进行操作[...](6)
我们可以这样理解:
从 (1) 和 (4) 中,初级是条件表达式的最小的、自主的元素,例如:
-a FILE
、FILE1 -nt FILE2
、STRING
、-n STRING
、STRING1 == STRING2
... 与一元或二元相关操作员。
从 (2) (以及 (4)、(5) 和 (6)),通过扩展,操作员本身可以被指定为“主要”,了解它与相关操作数一起出现(与“命令”非常相似,可以指定内置实用程序或程序,或者在此实用程序或程序上构建的命令行以及适当的参数)。
并由 (1) 和 (3)初级是可以组合形成更复杂的条件表达式的最小模块例如-a FILE && FILE1 -nt FILE2
使用 && (AND) 运算符、-n STRING || STRIN1 == STRING2
使用 || (OR) 运算符,! STRING
带有 ! (非)运算符。