分享

if 使用1-比较运算

 nxhujiee 2010-05-07

if 的比较运算

 

在批处理程序中执行条件处理。

 

语法

 

if [not] string1==string2command [else command2]

 

如果启用了命令扩展(默认),可以使用以下语法:

 

if [/i] string1 compareopstring2 command [else command2]

 

参数

 

not
指定只有当条件为假时才执行该命令。  
command
指定只有满足前面的条件时才应执行的命令。
string1==string2
只有当 string1string2相同时才能指定真条件。这些值可以是文字字符串或批处理变量(例如,%1)。对于文字字符串,不需要使用问号。
CompareOp
指定 3 个字母的比较运算符。下表列出了 compareop 的有效值。

 

运算符 说明
EQU 等于
NEQ 不等于
LSS 少于
LEQ 少于或等于
GTR 大于
GEQ 大于或等于

 

/i
强制字符串比较忽略大小写。可以在 ifstring1==string2 形式上使用/i。这些比较是通用的,如果string1string2都由所有的数字组成,那么字符串将被转换为数字并且将执行数字比较。
command2
指定将传递给 else 子句中命令的命令行命令和任何参数。
/?
在命令提示符显示帮助。

 

注释

 

  • 如果 if 命令中指定的条件为真,则系统将执行该条件后的命令。如果条件为假,则 if子句中的命令将被忽略,同时执行 else 子句中的任何命令 command2(如果指定)。
  • 使用 else 子句

    else 子句必须出现在与 if 后的命令相同的行中。

     

    ::示例1

    @echo off&setlocalenabledelayedexpansion
    for %%i in (0 1) do (
    set /a n+=1
    if %%i == 0 (
    echo 第!n!次循环时,变量为0
    ) else (
    echo 第!n!次循环时,变量为1
    )
    )
    pause

     

    如果要完全在单行上格式化它,可以使用如下形式的原始声明:

     

    ::示例2

    @echo off&setlocalenabledelayedexpansion
    for %%i in (0 1) do (
    set /a n+=1
    if %%i == 0 (echo 第!n!次循环时,变量为0) else echo 第!n!次循环时,变量为1
    )
    pause

    de> DE>

详解 

 

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,数字比较运算:

 

  1. 只有不被引号引起来,并使用运算符时才执行数字比较运算。
  2. 在执行数字比较运算时,当这个数字不是0时,检查数字的第1个字符,如果不是0,即为10进制;如果是0,则不是10进制数字。然后检查第2个字符,如果第2个字符是x(大小写都可以),则为16进制,如果不是,则认为是8进制数字。
  3. 当一个数字构成为非法时,执行的是字符比较。例如: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,比较运算:

 

  1. 字母是可以比较运算大小的。
  2. 数字比较运算是不区分大小写的(阿拉伯数字),而字母是区分大小写的。所以,大小写不同的字母,是不能直接比较运算的,必须使用 /i来忽略。
  3. 字母比较运算时,是从第一个字符开始,逐一进行的。
  4. 特别注意,在字母与数字进行混合比较运算时,是按字符的方式比较的,即数字不是作为一个整体来看的,例如:a24小于a5。
  5. 特别注意,在字母与数字进行混合比较运算时,字母是大于数字的。
  6. 单纯的数字比较运算,是以他们对应的数值来比较的。例如 0x12 、 022 和18都对应18,所以他们相等。而字母,是按照字母顺序进行比较运算的。例如:a小于b,而y大于或等于x。
  7. 比较运算的符号,只能是 EQU、NEQ、LSS、LEQ、GTR、GEQ,不包括 == 。
  8. 汉字也是可以进行比较运算的,但其比较的是编码顺序。当汉字与数字、字母混合比较时,比较的是编码顺序。但汉字的编码顺序永远高于字母,字母高于数字。 

 

4,英文引号下的比较运算:

 

  纯数字比较运算,是不可以使用引号的,为什么?因为当使用了引号,即被引起来的就认为是字符,而字符比较运算的原则是从第一个字符开始,逐一比较。所以就可能出现19小于5的情况。看以下示例说明:

  1. 19 大于 5,因为没有使用引号,进行数字比较。
  2. "19" 小于 5,19被引,所以拆19的第一个字符与5比较,小于。
  3. 19 大于 "5",19没有被引,作为一个整体,与5比较,大于。
  4. "19" 小于 "5",都被引,比较第一个字符,1小于5。
  5. "0x12" 小于17,0x12被引,即不再是16进制数字(对应10进制为18),而是作为字符比较。第一个字符0与17比较,小于。
  6. "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

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多