WindowsBatch与LinuxShell比较[batch常见错误]
WindowsBatch与LinuxShell比较[batch常见错误]
pauserem 运行结果是“5比40大!”
比较一下这两段代码,其差别就在引号“""”上。即当变量没被引号括起来的时候进行的是数字的比较;而被引号括起来就是进行字符串的比较(比较字符串时当然5比40大)。
三 if中注意空变量
@echo off
set hero=
if %hero% equ 1 (echo 正确!) else (echo 错误!)
pause
错了吗?
答:错了。此时变量hero的值为空,即if语句相当于“if equ 1 (echo 正确!) else (echo 错误!)”,equ前面没有东西,当然不对。
解决方法:加上引号,即“if "%hero%" equ "1" (echo 正确!) else (echo 错误!)”
四 errorlevel使用的错误。
@echo off
find "hero" 1.txt
if errorlevel 0 echo 找到了!&goto next
if errorlevel 1 echo 没找到!&goto next
:next
pause
错了吗?
答:错了!这样写无论1.txt中有没有字符串“hero”都会显示“找到了!”。
原因是“if errorlevel 0 echo 找到了!&goto next”这句相当于“if %errorlevel% gtr 0 echo 找到了!&goto next”。因此错误码大的一定要写在前面。
五重定向的问题
如果你要向一个文件中写入数字1,也许你会这样写:
@echo off
echo 1>hero.txt
pause
但这样写是错误的,因为这里的数字1有其它用途--代表了
标准输出流。
一般情况下不要用个位数直接接重定向符号。
那么如何解决这个问题呢?我们可以换另外一种格式:
@echo off
>hero.txt echo 1
pause
?
六 罪恶的双引号双引号在单个使用的时候非常容易犯错误。“"”后面的字符串在第二个“"”出现之前都会被当成一般字符!
@echo off
if hero==hero (echo hero is me")
pause
这段代码运行不成功,原因是引号后面的括号“)”被当作是一般字符了。
@echo off
echo hero is me"&pause
pause
这段代码也出乎了我们的意料,原因是引号后面的&被当作是一般字符了。
批处理中双引号的优先级比较高,但低于百分号,也就是说双引号中的百分号不会被识别为普通字符。
七 罪恶的空格,空格不能随便乱用,定义变量的时候不要再等号前后加空格,还有很多的情况都需注意。
八 续行符
想必大家都知道符号“^”是作为去掉后续符号特殊意义的前导符。“^”还可以作为续行符,就是指出下一行是所在行的延续。
举个简单的例子:
@echo off
echo 英雄^
是^
好^
男人
pause
九 再看重定向
我们知道一个创建快捷方式的方法:
echo [InternetShortcut] >>a.url
echo URL=c:\windows\system32\notepad.exe >>a.url
echo IconIndex=20 >>a.url
echo IconFile=C:\windows\system32\shell32.dll >>a.url
是不是觉得代码中每一句都要加上“>>a.url”很繁琐。其实有一个简单的方法:
(
echo [InternetShortcut]
echo URL=c:\windows\system32\notepad.exe
echo IconIndex=20
echo IconFile=C:\windows\system32\shell32.dll
)>a.url
完!
?
感谢,Thanks!
作者:iTech
出处:http://itech.cnblogs.com/