为何GNU expr执行'a > -a'返回1、'a > -aa'返回0?
问题解析:
expr命令字符串比较结果异常的原因 核心原因:区域设置(LC_COLLATE)的排序规则差异
你遇到的现象本质是系统默认UTF-8排序规则和C语言环境(LC_COLLATE=C)的字节序排序之间的差异导致的:
1. 默认UTF-8排序规则下的表现
在默认的UTF-8区域设置中,排序规则会将-、+、*这类符号视为非关键前缀字符,优先比较后续的字母内容:
- 比较
a和-a时,两者后续字母都是a,但a没有前缀符号,因此判定a > -a,返回1。 - 比较
a和-aa时,第一个字母相同,但后者多了一个a,整体长度更长且后续字符匹配,排序规则会认为-aa更大,所以返回0。 - 替换成
+或*结果一致,因为这些符号在UTF-8排序规则中同样被当作非关键前缀处理。
2. C语言环境(LC_COLLATE=C)下的表现
当设置LC_COLLATE=C时,排序规则变为严格按照ASCII字节值比较:
- ASCII编码中,
-(45)、+(43)、*(42)的字节值都远小于a(97),所以不管这些符号后面跟着什么字符,a都会比以它们开头的字符串大,因此expr a \> -a和expr a \> -aa都会返回1。
关于运算符识别的疑问
expr并没有把这些符号当作运算符处理——你已经通过转义\>明确指定了比较操作,-a、+a等都是作为普通字符串参与比较的。问题核心不是运算符识别,而是字符串比较采用的排序规则不同。
内容的提问来源于stack exchange,提问作者Luv_Ray
相关产品推荐
相关产品推荐

