在 DOS/批处理中,
if 08 lss 1 echo true
与“真”相呼应。 09也是如此。08和09都小于1。
However,
if 07 lss 1 echo true
不回显任何内容。 01至07不小于1。
为什么? 08年和09年有什么特别之处?
扩展 sarnold 和 David Schwartz 已经提供的答案......
我从未见过任何文档表明 IF 支持八进制或十六进制数字表示法。但你的问题促使我做了一些测试,实际上它确实支持 SET /A 支持的相同数字表示法。
- 任何不以 0 开头的数字 [0-9] 组都被解释为十进制。
- 任何以 0 为前缀的数字 [0-7] 集合都被解释为八进制。
- 任何以 0x 或 0X 为前缀的数字组 [0-9,A-F,a-f] 都被解释为十六进制。
任何不满足上述 3 个数字符号中任何一个的字符集都将被视为字符串。
如果比较两边都是有效数字,则进行数字比较。
如果任一侧都不是有效数字,则进行字符串比较。
07是有效的八进制表示法,十进制值为7,且不小于1。
08 和 09 以 0 为前缀,但不是有效的八进制表示法,因此进行字符串比较。任何以 0 开头的字符串都将排序为小于以 1 开头的字符串。
一些有趣的测试来确认支持八进制和十六进制表示法。
if 0xA equ 10 echo ok
if 011 equ 9 echo ok
有点有趣的是,SET /A 语句中无效的八进制或十六进制表示法会引发错误。但 IF 语句中无效的八进制或十六进制表示法不会引发错误。它只是强制进行字符串比较。
Update
有效数字前面可以带有符号指示符:- 或 +
if +0xA equ +10 echo ok
if -011 equ -9 echo ok
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)