powershell 中比较运算符"-gt"短横的来历

问题:为什么运算符是 -like、‑gt,前面带减号 -,不能直接写 like、gt?

先直接结论:
‑like / ‑gt / ‑eq / ‑match 不是普通函数、也不是关键字;它们是 PowerShell 专属的比较运算符标记,开头短横-是语法设计的一部分。
如果你直接写 like $a $b,PowerShell不会把它识别成比较,会尝试把like解释成一个命令/程序名,直接报错。

一、先看其它脚本语言做对比

🟢 Bash / Python

Python:a > 5,in;符号或者单词直接作为语言内置关键字。

if name in text:
if x > 10:

🟡 PowerShell 的历史背景(设计者视角)

PowerShell底层是Shell +脚本语言二合一。
Shell的第一要务:命令优先!

PowerShell设计哲学第一条:命令(Cmdlet)优先解析。
任意一串英文单词,解释器优先尝试把它当做一条外部命令、函数、cmdlet去运行。

设想一下,如果设计者把比较运算符直接设计成裸单词:

#【假想的错误语法,并不存在】
if ($x gt 5)

当解析器读到单词gt:
解释器第一反应:gt是不是一个可执行程序?是不是一个函数?是不是cmdlet?
解释器会优先去PATH里面搜索名叫gt的命令。
于是产生歧义!分不清这到底是:

  1. 一条名叫gt的外部命令;
  2. 还是脚本语言里面的“大于”比较运算符。

⚠️ 歧义是Shell语言最大的坑。
Shell本来就是用来跑外部程序的;大量简短英文名字的可执行文件随处可见。
如果比较运算符直接使用裸英文单词,随时会和用户写的命令、外部exe重名冲突。

👉 所以设计者选择统一约定:所有这类语言内部运算符,名称前面强制增加短横线‑。
‑gt、‑lt、‑eq、‑ne、‑like、‑match、‑contains。
开头‑就是一个识别标记!告诉解析器:这不是一条命令,这是语言内置运算符!不要去磁盘搜索同名程序。

二、第二点设计:统一风格,和Cmdlet参数保持形式一致

PowerShell cmdlet 的参数全部以短横线开头:

Get‑ChildItem -Recurse -Filter *.txt
Where‑Object -Property Name -like "abc*"

设计者希望整个语言符号视觉统一:

-XXX 代表“语言内部标记”:既用于cmdlet的命名参数,也用于运算符。
看到开头横杠,解释器立刻知道:这是语言层面的符号,不是要启动外部命令。

补充历史:PowerShell的前身Monad团队设计的时候刻意放弃了C‑style的> < ==符号。
为什么不完全用 > <?
因为 > 在shell里面已经被占用为重定向输出符号!

dir > out.txt   # >是输出重定向!

❗大于符号>已经被shell拿做重定向;小于<用于输入重定向。
所以不能再拿>当做数字大于的比较运算符!
于是只能改用英文单词描述语义:

  • greater‑than → ‑gt
  • less‑than → ‑lt
  • equal → ‑eq
  • like(通配符模糊匹配)→‑like

这就是为什么不用 >,反而要用 -gt。
普通编程语言 if($a>10);powershell必须写 if($a -gt 10)。

三、第三点:语义可读性(面向运维人员,不是C程序员)

微软当时的目标用户是Windows系统管理员(运维),很多人不熟悉编程符号。
用英文缩写单词而不是符号:
‑gt = greater than(大于)
‑lt = less than(小于)
‑like = like(像、模糊匹配)
即使不懂编程,看到单词大概能猜含义;短横‑只是前缀标识。

四、反面演示,试一下去掉横杠会发生什么

如果你故意写,不带横杠:

10 like 8

PowerShell解析:like是命令名称。
它会尝试去找一个叫like.exe的程序,直接报错:

like : 无法将“like”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

完全无法识别成比较运算。

五、顺带提简化语法(Where‑Object简写形式)

$allApps | Where‑Object DisplayName -like "*CUDA*"

这里 -like依然保留减号。即使省略脚本块{}的简化写法,运算符前面的‑不能丢掉。

✨总结,从设计者视角梳理三条核心动机

  1. 消除Shell解析歧义(最重要)
    Shell优先解析单词为外部命令;‑作为前置标记,告诉解释器:这是内置运算符,不要搜索外部exe。避免运算符名字和可执行文件名冲突。
  2. Shell重定向符号已经抢占了> <
    >、<已经用于输出、输入重定向,不能复用做大小比较;改用英文单词缩写形式。
  3. 语言风格统一 + 面向运维人员可读性
    整个环境里面,参数、运算符统一使用‑开头;使用英文缩写,降低运维人员记忆门槛。

补充记忆点:
在PowerShell中,凡是这种用来做条件判断的:‑eq,‑ne,‑gt,‑lt,‑ge,‑le,‑like,‑notlike,‑match,‑notmatch,‑contains,全部必须带前面的短横杠‑。

posted @ 2026-09-30 09:45  立体风  阅读(5)  评论(0)    收藏  举报