if 的比較運(yùn)算
在批處理程序中執(zhí)行條件處理。
語法
if [not] string1==string2command [else command2]
如果啟用了命令擴(kuò)展(默認(rèn)),可以使用以下語法:
if [/i] string1 compareopstring2 command [else command2]
參數(shù)
- not
- 指定只有當(dāng)條件為假時才執(zhí)行該命令。
- command
- 指定只有滿足前面的條件時才應(yīng)執(zhí)行的命令。
- string1==string2
- 只有當(dāng) string1 和 string2相同時才能指定真條件。這些值可以是文字字符串或批處理變量(例如,%1)。對于文字字符串,不需要使用問號。
- CompareOp
- 指定 3 個字母的比較運(yùn)算符。下表列出了 compareop 的有效值。
運(yùn)算符 | 說明 |
EQU | 等于 |
NEQ | 不等于 |
LSS | 少于 |
LEQ | 少于或等于 |
GTR | 大于 |
GEQ | 大于或等于 |
- /i
- 強(qiáng)制字符串比較忽略大小寫。可以在 if 的string1==string2 形式上使用/i。這些比較是通用的,如果string1 和 string2都由所有的數(shù)字組成,那么字符串將被轉(zhuǎn)換為數(shù)字并且將執(zhí)行數(shù)字比較。
- command2
- 指定將傳遞給 else 子句中命令的命令行命令和任何參數(shù)。
- /?
- 在命令提示符顯示幫助。
注釋
詳解
1, == 與 EQU 之間的區(qū)別:
作為初學(xué)者,很容易將 == 與 EQU 混淆的認(rèn)為他們一樣,其實(shí)這是不對的。==是用來比較相同的,換句話說,就是比較字符串是否完全相同的。而 EQU是比較運(yùn)算符,含有運(yùn)算的功能,換句話說,是可以在比較之前轉(zhuǎn)換數(shù)字為對應(yīng)的數(shù)值,然后再比較。
既然說到了數(shù)值,我們就擴(kuò)展講一下:數(shù)值是指十進(jìn)制的數(shù)字,在前綴加 0× (這里x忽略大小寫)則表示十六進(jìn)制數(shù)字,加 0則表示八進(jìn)制數(shù)字。因此,0x12 與 18 相同,也與 022 相同,八進(jìn)制表示法容易引起混淆。例如,08 和 09不是有效數(shù)字,因?yàn)?8 和 9 不是有效的八進(jìn)制數(shù)字。
所以,在使用 == 比較時,0x12、022和18是不相等的,但在使用 EQU比較時,他們是相等的,因?yàn)樗麄儗?yīng)的數(shù)值都是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,數(shù)字比較運(yùn)算:
- 只有不被引號引起來,并使用運(yùn)算符時才執(zhí)行數(shù)字比較運(yùn)算。
- 在執(zhí)行數(shù)字比較運(yùn)算時,當(dāng)這個數(shù)字不是0時,檢查數(shù)字的第1個字符,如果不是0,即為10進(jìn)制;如果是0,則不是10進(jìn)制數(shù)字。然后檢查第2個字符,如果第2個字符是x(大小寫都可以),則為16進(jìn)制,如果不是,則認(rèn)為是8進(jìn)制數(shù)字。
- 當(dāng)一個數(shù)字構(gòu)成為非法時,執(zhí)行的是字符比較。例如:08小于1。因?yàn)椴淮嬖?8這個數(shù)字,即認(rèn)為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,比較運(yùn)算:
- 字母是可以比較運(yùn)算大小的。
- 數(shù)字比較運(yùn)算是不區(qū)分大小寫的(阿拉伯?dāng)?shù)字),而字母是區(qū)分大小寫的。所以,大小寫不同的字母,是不能直接比較運(yùn)算的,必須使用 /i來忽略。
- 字母比較運(yùn)算時,是從第一個字符開始,逐一進(jìn)行的。
- 特別注意,在字母與數(shù)字進(jìn)行混合比較運(yùn)算時,是按字符的方式比較的,即數(shù)字不是作為一個整體來看的,例如:a24小于a5。
- 特別注意,在字母與數(shù)字進(jìn)行混合比較運(yùn)算時,字母是大于數(shù)字的。
- 單純的數(shù)字比較運(yùn)算,是以他們對應(yīng)的數(shù)值來比較的。例如 0x12 、 022 和18都對應(yīng)18,所以他們相等。而字母,是按照字母順序進(jìn)行比較運(yùn)算的。例如:a小于b,而y大于或等于x。
- 比較運(yùn)算的符號,只能是 EQU、NEQ、LSS、LEQ、GTR、GEQ,不包括 == 。
- 漢字也是可以進(jìn)行比較運(yùn)算的,但其比較的是編碼順序。當(dāng)漢字與數(shù)字、字母混合比較時,比較的是編碼順序。但漢字的編碼順序永遠(yuǎn)高于字母,字母高于數(shù)字。
4,英文引號下的比較運(yùn)算:
純數(shù)字比較運(yùn)算,是不可以使用引號的,為什么?因?yàn)楫?dāng)使用了引號,即被引起來的就認(rèn)為是字符,而字符比較運(yùn)算的原則是從第一個字符開始,逐一比較。所以就可能出現(xiàn)19小于5的情況??匆韵率纠f明:
- 19 大于 5,因?yàn)闆]有使用引號,進(jìn)行數(shù)字比較。
- "19" 小于 5,19被引,所以拆19的第一個字符與5比較,小于。
- 19 大于 "5",19沒有被引,作為一個整體,與5比較,大于。
- "19" 小于 "5",都被引,比較第一個字符,1小于5。
- "0x12" 小于17,0x12被引,即不再是16進(jìn)制數(shù)字(對應(yīng)10進(jìn)制為18),而是作為字符比較。第一個字符0與17比較,小于。
- "022" 小于17,022被引,即不再是8進(jìn)制數(shù)字(對應(yīng)10進(jìn)制為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,啟用延遲的環(huán)境變量擴(kuò)展:
當(dāng)啟用延遲變量時,沒有被引號引起來的動態(tài)擴(kuò)展變量中,如果含有空格()、英文逗號(,)、英文分號(;)、等號(=),需要使用轉(zhuǎn)義符(^)進(jìn)行操作,例如:
::示例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 |