30

构造-ne,-eq-gt看起来至少很奇怪。

if ($true -eq $true){}

但不是

if ($true = $true){}

解释是什么?

4

3 回答 3

38

基本上,答案是 Unix 一直以来都是这样做的。果然,如果您编写了一些您将使用的 Bash 脚本,并且将您的 PowerShell 语法知识一对一地转移到 Bash 中,这实际上是一件好事。

Bruce Payette 的Windows PowerShell in Action , Second Edition (Kindle Location 3391) 对此进行了详细解答。

让我们谈谈 PowerShell 语言中最具争议的设计决策。

赢家是:为什么我们不使用常规符号进行比较,如 >、>=、<、<=、== 和 !=?

答案是 > 和 < 字符用于输出重定向。因为 PowerShell 是一个 shell,并且过去 30 年中的所有 shell 语言都使用 > 和 < 进行 I/O 重定向,所以人们期望 PowerShell 也应该这样做。在 PowerShell 的第一个公开测试版期间,该主题引发了持续数月的讨论。

我们研究了多种替代方案,例如模态解析,其中有时 > 表示大于,有时表示重定向。我们查看了诸如 :> 或 -> 等运算符的替代字符序列,用于重定向或比较。我们进行了可用性测试并举行了焦点小组讨论,最后,我们确定了我们的开始。

重定向运算符是 > 和 <,比较运算符取自 Unix test(1) 命令。我们预计,由于这些运算符拥有 30 年的血统,因此它们足以在 PowerShell 中使用。(我们还希望人们会继续抱怨这一决定,但希望不会再持续 30 年。)

于 2012-04-24T00:43:35.923 回答
7

因为>and<是大多数 shell 中的流重定向运算符。好吧,除了 PowerShell 不支持流输入重定向。>除此之外,在某些情况下解析/解释为重定向 stdout 和在其他情况下会更加困难greater than。此外,通过使用该-<operator_name>方法,您可以拥有比直观符号更多的运算符,例如 -contains、-notcontains、-is、-replace、-split、-match 等。执行man about_operators作为探索 PowerShell 支持的所有运算符的起点.

于 2012-04-24T00:05:05.547 回答
2

运算符 = 已经是赋值运算符。为了不混淆比较和赋值运算符,他们选择了另一个运算符。在本例中为 -eq,因为它已在其他 (UNIX) 脚本语言中使用。

于 2014-07-30T08:26:33.540 回答