为什么在PowerShell中等于符号是“-eq”,而不是“=”?

31

构造用法中的-ne-eq-gt看起来至少很奇怪。

if ($true -eq $true){}

但不包括

if ($true = $true){}

请问这个东西的解释是什么?

3个回答

39

基本上答案是Unix一直以来都是这么做的。如果你写一些Bash脚本,那就会使用它,而且将你的PowerShell语法知识一对一地转移到Bash中,实际上非常方便。

在Bruce Payette的 Windows PowerShell in Action ,第二版(Kindle位置3391)中详细回答了这个问题。

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

胜出者是:为什么我们没有使用传统的比较符号 >、>=、<、<=、== 和 != ?

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

我们考虑了各种替代方案,例如模态解析,其中有时>表示大于,有时表示重定向。我们考虑了运算符的替代字符序列,如:>或->,无论是用于重定向还是比较。我们进行了可用性测试和焦点小组讨论,最终还是决定沿用最初的方案。

重定向运算符为 > 和 <,比较运算符取自Unix test(1)命令。我们认为,由于这些运算符已经有了30年的历史,它们足够适用于在PowerShell中使用。(我们也期望人们将继续对这个决定提出抱怨,但希望不要持续30年以上。)


7

因为在大多数shell中,><是流重定向运算符。好吧,除了PowerShell不支持流输入重定向之外。抛开这个问题,有时解析/解释>以将stdout重定向到其他位置会更加困难,而在其他情况下则表示“大于”。此外,通过使用-<operator_name>方法,您可以拥有比直观符号更多的运算符,例如-contains,-notcontains,-is,-replace,-split,-match等。执行man about_operators作为开始探索PowerShell支持的所有运算符的起点。


1
在哪些情况下解析 > 会更加困难? - Restuta
if表达式的作用范围非常有限。我甚至无法想象如何在其中放置重定向。 - Mike Chaliy
我认为在这里提出更多的运算符并不是一个有效的论点,我认为综合方法会更好地发挥作用,以下运算符“< > != ==”经常被使用,支持它们是值得的。 - Restuta

2

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


1
终于有人在使用“=”而不是“==”时指出了OP的问题 :P - information_interchange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接