Bash中<运算符比较三位数数值时测试异常问题问询
问题解答:Bash中
<与-lt比较运算符的差异 1. 现象原因
在Bash的[[ ... ]]条件结构里,<和-lt是完全不同类型的比较运算符:
-lt是数值比较运算符,会把操作数当作整数处理,严格按照数值大小判断。<是字符串比较运算符,按照ASCII字典序逐个字符对比字符串,不会把内容当作数值解析。
结合你的测试案例拆解:
- 当
lng99=99时,用<比较"99"和"3":第一个字符'9'的ASCII值(57)大于'3'的ASCII值(51),所以"99" < "3"结果为false,进入else分支,输出符合预期。 - 当
lng100=100时,用<比较"100"和"3":第一个字符'1'的ASCII值(49)小于'3'的ASCII值(51),所以"100" < "3"结果为true,进入then分支,这就是你看到的“异常”。
而-lt在两种场景下都正确,因为它把99和100都当作整数,和3比较时自然都大于3,所以始终进入else分支。
2. 这是Bug还是特性?
这绝对是特性,不是Bug。Bash的条件判断语法明确区分了字符串比较和数值比较的运算符:
- 字符串比较:
<(小于)、>(大于)、==(相等)、!=(不等)——用于判断字符串的字典序关系 - 数值比较:
-lt(小于)、-gt(大于)、-eq(等于)、-ne(不等于)、-le(小于等于)、-ge(大于等于)——用于整数的大小判断
这种设计是为了适配不同场景的比较需求,比如你需要排序字符串时用</>,统计数值大小就用-lt/-gt。
你的测试代码
#!/bin/bash string99="abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrstuvwxy" string100="abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrstuvwxyz" lng99=`expr length $string99` lng100=`expr length $string100` echo echo "-- 99 --------- if [[ \$lng < 3 ]] -----------------" if [[ $lng99 < 3 ]] then echo "$string99 is $lng99 characters long." else echo "length of string is greater than 3" fi echo echo "-- 99 -------- if [[ \$lng -lt 3 ]] ----------------" if [[ $lng99 -lt 3 ]] then echo "$string99 is $lng99 characters long." else echo "length of string is greater than 3" fi echo echo "-- 100 -------- if [[ \$lng < 3 ]] -----------------" if [[ $lng100 < 3 ]] then echo "$string100 is $lng100 characters long." else echo "length of string is greater than 3" fi echo echo "-- 100 ------- if [[ \$lng -lt 3 ]] ----------------" if [[ $lng100 -lt 3 ]] then echo "$string100 is $lng100 characters long." else echo "length of string is greater than 3" fi
测试输出
-- 99 --------- if [[ $lng < 3 ]] ----------------- length of string is greater than 3 -- 99 -------- if [[ $lng -lt 3 ]] ---------------- length of string is greater than 3 -- 100 -------- if [[ $lng < 3 ]] ----------------- abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrstuvwxyz is 100 characters long. -- 100 ------- if [[ $lng -lt 3 ]] ---------------- length of string is greater than 3
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

