`

WindowsBatch与LinuxShell比较[batch常见错误]

 
阅读更多

WindowsBatch与LinuxShell比较[batch常见错误]

 
一 变量延迟
为了更好的说明问题,我们先引入一个例子。
例1:
@echo off
set a=4
set a=5&echo %a%
pause
结果:4
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?

让我们先了解一下批处理运行命令的机制:
批处理读取命令时是按行读取的,在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例1,批处理在运行到这句“set a=5&echo %a%”之前,先把这一句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)

而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。

那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:
例2:
@echo off
setlocal enabledelayedexpansion
set a=4
set a=5&echo !a!
pause
结果:5
解说:由于启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。

分析一下例2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为4,“set a=5&echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。

再举一个例子巩固一下。
例3:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
)
pause

结果:
1
2
3
4
5

二 if中的判断
不多说了,直接看这两段代码。
1、
@echo off
set a=5
set b=40
if %a% gtr %b% echo 5比40大!
pause
rem 运行结果是“按任意键继续…”
2、
@echo off
set a=5
set b=40
if "%a%" gtr "%b%" echo 5比40大!
pause
rem 运行结果是“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/

分享到:
评论

相关推荐

    shell,bat脚本运行java程序

    在IT行业中,shell脚本和bat脚本是两种常见的批处理工具,用于自动化执行一系列操作系统命令。当需要定期或按需运行Java程序时,利用这两种脚本语言可以极大地提高工作效率。下面将详细介绍如何使用shell脚本(适用...

    Linux指令一周通 (技术图书大系).azw3

    5.3 batch指令:执行批处理指令 5.4 bg指令:将程序放在后台执行 5.5 chfn指令:设置finger信息 5.6 chsh指令:改变登录系统时的shell 5.7 clear指令:清除屏幕信息 5.8 date指令:显示或设置系统时间 5.9 echo指令...

    三个批处理文件

    批处理脚本可以使用多种编程语言或脚本语言编写,但最常见的是使用Windows批处理语言(.bat文件)或Unix/Linux shell脚本(.sh文件)。 ### Windows批处理脚本示例 下面是一个基本的Windows批处理脚本示例,用于从...

    运行外部程序.rar

    在Python中,Linux下运行外部程序的方式与Windows类似: ```python import subprocess subprocess.run(['gedit', 'example.txt']) ``` macOS与Linux类似,因为它们都基于Unix,但需要注意的是,某些程序可能需要...

    batch-mpv-should-work-for-all-device-:(应该适用于所有设备)

    2. **跨平台兼容性**:考虑到“适用于所有设备”的目标,开发者需要了解多种操作系统的工作原理,包括Windows的批处理、Unix/Linux的shell脚本或MacOS的AppleScript。 3. **MPV配置**:MPV有丰富的配置选项,可能...

    Q702697 怎么将一个文件拷贝到指定目录下的所有子文件夹中

    - **Windows批处理(Batch Script)**:在Windows中,可以编写批处理脚本来实现这个功能。使用`xcopy`命令,例如:`xcopy C:\source\file.txt C:\target\* /S /E`,其中 `/S` 表示复制子目录中的文件(但不包括空的...

    經典批處理 經典批處理

    3. **脚本语言**:如Windows批处理(.bat文件),Unix/Linux的Shell脚本等,用于编写批处理任务的具体指令。 4. **并行处理**:批处理系统可能支持并行化执行,通过多线程或多进程提高处理速度。 5. **错误处理和...

    unix power tools 3ed.pdf

    - **常见陷阱**: shell脚本开发中常见的问题和解决方案。 - **最佳实践**: 编写高质量shell脚本的最佳实践。 #### 七、扩展和管理您的环境 (Part VII: Extending and Managing Your Environment) **7.1 备份文件 ...

    批量修改文件名

    5. **批处理脚本**:对于高级用户,支持批处理脚本的工具更受欢迎,这样可以通过编写简单的脚本来自动处理大量文件,例如在Windows中使用批处理命令(batch script)或者在Unix/Linux系统中使用shell脚本。...

    mongodb数据库tsv文件导入.rar

    MongoDB的安装过程相对简单,适用于Windows、Linux和macOS等操作系统。安装包中通常包含了服务器组件、管理工具以及驱动程序。在Windows上,这可能是一个.msi文件,而在Linux上,你可能需要下载.tgz或.rpm文件。安装...

    全批处理及批处理编程开发工具

    4. **批处理编程**:批处理编程涉及到编写批处理脚本,通常是用批处理语言(如Windows下的CMD批处理语言或Linux下的Shell脚本)实现。这些脚本可以包含逻辑控制、变量操作、文件操作等元素,以实现复杂的任务流程。 ...

    GENESIS脚本!~

    3. **Shell脚本** (.sh): 如果是Linux或Mac环境,可能是Bash或其他Shell语言编写的脚本。 4. **VHDL或Verilog脚本** (.vhd or .v): 这两种是硬件描述语言,用于电路设计和仿真。 使用这些脚本时,你需要将它们放置...

    bat学习笔记1

    它包含了DOS命令行指令,当双击运行时,系统会按照文件中的指令顺序逐一执行,类似于Linux或Unix的Shell脚本。 2. **bat文件的创建与运行** 创建bat文件非常简单,只需用任何文本编辑器(如记事本)编写命令,然后...

    批量替换文件名中的字符

    2. **Linux/Unix Shell 脚本**:在Linux或Unix系统中,我们可以使用`rename`命令或`find`和`sed`组合来完成替换。例如,使用`rename`命令: ```bash rename 's/#/空/' * # 用空格替换所有文件名中的# ``` 或者...

    批处理对数据库的应用

    在Unix/Linux环境中,则可以使用Shell脚本来实现类似的功能。 #### 五、案例分析 假设有一个电子商务网站需要定期处理大量的订单数据。为了提高处理效率,可以采用批处理技术来优化数据处理流程: 1. **数据收集*...

    MyScripts

    这些脚本可能包括 Bash shell 脚本(Linux 和 macOS 系统),Python 脚本(通用编程语言,适合各种任务),或者是 PowerShell 脚本(Windows 环境)。每个脚本都有其独特功能,可能是文件操作、系统监控、网络通信,...

    网管教程 从入门到精通软件篇.txt

    Chkdsk 命令还可列出并纠正磁盘上的错误。  含有下列参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 chkdsk 命令。  vol [drive:] [ chkdsk [drive:] [/p] [/r]  ...

Global site tag (gtag.js) - Google Analytics