if 的比较运算
在批处理程序中执行条件处理。
语法
if [not] string1==string2command [else command2]
如果启用了命令扩展(默认),可以使用以下语法:
if [/i] string1 compareopstring2 command [else command2]
参数
- not
- 指定只有当条件为假时才执行该命令。
- command
- 指定只有满足前面的条件时才应执行的命令。
- string1==string2
- 只有当 string1 和 string2相同时才能指定真条件。这些值可以是文字字符串或批处理变量(例如,%1)。对于文字字符串,不需要使用问号。
- CompareOp
- 指定 3 个字母的比较运算符。下表列出了 compareop 的有效值。
运算符 |
说明 |
EQU |
等于 |
NEQ |
不等于 |
LSS |
少于 |
LEQ |
少于或等于 |
GTR |
大于 |
GEQ |
大于或等于 |
- /i
- 强制字符串比较忽略大小写。可以在 if 的string1==string2 形式上使用/i。这些比较是通用的,如果string1 和 string2都由所有的数字组成,那么字符串将被转换为数字并且将执行数字比较。
- command2
- 指定将传递给 else 子句中命令的命令行命令和任何参数。
- /?
- 在命令提示符显示帮助。
注释
详解
1, == 与 EQU 之间的区别:
作为初学者,很容易将 == 与 EQU 混淆的认为他们一样,其实这是不对的。==是用来比较相同的,换句话说,就是比较字符串是否完全相同的。而 EQU是比较运算符,含有运算的功能,换句话说,是可以在比较之前转换数字为对应的数值,然后再比较。
既然说到了数值,我们就扩展讲一下:数值是指十进制的数字,在前缀加 0× (这里x忽略大小写)则表示十六进制数字,加 0则表示八进制数字。因此,0x12 与 18 相同,也与 022 相同,八进制表示法容易引起混淆。例如,08 和 09不是有效数字,因为 8 和 9 不是有效的八进制数字。
所以,在使用 == 比较时,0x12、022和18是不相等的,但在使用 EQU比较时,他们是相等的,因为他们对应的数值都是18!参考下面的示例3:
::示例3
@echo off if 0x12 equ 0X12 echo 0x12 等于equ 0X12 if 0x12 equ 18 echo 0x12 等于equ 18 if 0x12 equ 022 echo 0x12 等于equ 022 if 022 equ 18 echo 022 等于equ 18 if 0x12 == 0X12 (echo 0x12 相同于== 0X12) else echo 0x12 不相同于==0X12 if /i 0x12 == 0X12 (echo 0x12 相同于== 0X12 忽略大小写) else echo 0x12不相同于== 0X12 忽略大小写 if 0x12 == 18 (echo 0x12 相同于== 18) else echo 0x12 不相同于== 18 if 0x12 == 022 (echo 0x12 相同于== 022) else echo 0x12 不相同于==022 if 022 == 18 (echo 022 相同于== 18) else echo 022 不相同于== 18 pause
|
2,数字比较运算:
- 只有不被引号引起来,并使用运算符时才执行数字比较运算。
- 在执行数字比较运算时,当这个数字不是0时,检查数字的第1个字符,如果不是0,即为10进制;如果是0,则不是10进制数字。然后检查第2个字符,如果第2个字符是x(大小写都可以),则为16进制,如果不是,则认为是8进制数字。
- 当一个数字构成为非法时,执行的是字符比较。例如:08小于1。因为不存在08这个数字,即认为08为字符,拆08的第一个字符0,与1比较,小于。参考下面示例4:
::示例4
@echo off if 07 gtr 1 echo 07大于1(7大于1) if 08 lss 1 echo 08小于1(“0”小于1) if 09 lss 1 echo 09小于1(“0”小于1) if 010 gtr 1 echo 010大于1(8大于1) pause
|
3,比较运算:
- 字母是可以比较运算大小的。
- 数字比较运算是不区分大小写的(阿拉伯数字),而字母是区分大小写的。所以,大小写不同的字母,是不能直接比较运算的,必须使用 /i来忽略。
- 字母比较运算时,是从第一个字符开始,逐一进行的。
- 特别注意,在字母与数字进行混合比较运算时,是按字符的方式比较的,即数字不是作为一个整体来看的,例如:a24小于a5。
- 特别注意,在字母与数字进行混合比较运算时,字母是大于数字的。
- 单纯的数字比较运算,是以他们对应的数值来比较的。例如 0x12 、 022 和18都对应18,所以他们相等。而字母,是按照字母顺序进行比较运算的。例如:a小于b,而y大于或等于x。
- 比较运算的符号,只能是 EQU、NEQ、LSS、LEQ、GTR、GEQ,不包括 == 。
- 汉字也是可以进行比较运算的,但其比较的是编码顺序。当汉字与数字、字母混合比较时,比较的是编码顺序。但汉字的编码顺序永远高于字母,字母高于数字。
4,英文引号下的比较运算:
纯数字比较运算,是不可以使用引号的,为什么?因为当使用了引号,即被引起来的就认为是字符,而字符比较运算的原则是从第一个字符开始,逐一比较。所以就可能出现19小于5的情况。看以下示例说明:
- 19 大于 5,因为没有使用引号,进行数字比较。
- "19" 小于 5,19被引,所以拆19的第一个字符与5比较,小于。
- 19 大于 "5",19没有被引,作为一个整体,与5比较,大于。
- "19" 小于 "5",都被引,比较第一个字符,1小于5。
- "0x12" 小于17,0x12被引,即不再是16进制数字(对应10进制为18),而是作为字符比较。第一个字符0与17比较,小于。
- "022" 小于17,022被引,即不再是8进制数字(对应10进制为18),而是作为字符比较。第一个字符0与17比较,小于。
参考下面的示例5:
::示例5
@echo off if 19 gtr 5 echo 19 大于 5 if "19" lss 5 echo "19" 小于 5 if 19 gtr "5" echo 19 大于 "5" if "19" lss "5" echo "19" 小于 "5" if "0x12" lss 17 echo "0x12" 小于 17 if "022" lss 17 echo "022" 小于 17 pause
|
5,启用延迟的环境变量扩展:
当启用延迟变量时,没有被引号引起来的动态扩展变量中,如果含有空格()、英文逗号(,)、英文分号(;)、等号(=),需要使用转义符(^)进行操作,例如:
::示例6
@echo off&setlocalenabledelayedexpansion for /l %%i in (1 1 9) do (set /aye=!random!%%4+1&set xing= for /l %%k in (1 1 !ye!) do set xing=0!xing! set han=!xing!%%i&set han=!han:~-6! echo 原始:!han! for /l %%k in (5 -1 1) do if !han:~0^,%%k! equ 0 sethan=!han:~%%k! echo 处理:!han!) pause
|