📄 dosbatch.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>将DOS批处理文件转换为Shell脚本</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="PREVIOUS"TITLE="一个简单的.bashrc文件"HREF="sample-bashrc.html"><LINKREL="NEXT"TITLE="练习"HREF="exercises.html"></HEAD><BODYCLASS="APPENDIX"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="sample-bashrc.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom"></TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="exercises.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="APPENDIX"><H1><ANAME="DOSBATCH"></A>Appendix L. 将DOS批处理文件转换为Shell脚本</H1><P><ANAME="DOSBATCH1"></A></P><P>相当多的在PC上学习脚本的程序员都在运行DOS. 事实上, 残废的DOS批处理文件语言还是可以编写出一些比较强大的脚本来的, 虽然它们一般都需要借助于外部的工具. 所以说, 某些时候, 我们还是需要将老式的DOS批处理文件转换为UNIX shell脚本. 一般来说, 做这种事情并不困难, 因为DOS批处理文件操作不过是等价的shell脚本的一个受限子集. </P><DIVCLASS="TABLE"><HR><ANAME="AEN18726"></A><P><B>表格 L-1. 批处理文件关键字 / 变量 / 操作符, 和等价的shell符号</B></P><TABLEBORDER="1"CLASS="CALSTABLE"><COL><COL><COL><THEAD><TR><TH>批处理文件操作符</TH><TH>Shell脚本等价符号</TH><TH>含义</TH></TR></THEAD><TBODY><TR><TD><CODECLASS="OPTION">%</CODE></TD><TD>$</TD><TD>命令行参数前缀</TD></TR><TR><TD><CODECLASS="OPTION">/</CODE></TD><TD>-</TD><TD>命令选项标记</TD></TR><TR><TD><CODECLASS="OPTION">\</CODE></TD><TD>/</TD><TD>目录路径分隔符</TD></TR><TR><TD><CODECLASS="OPTION">==</CODE></TD><TD>=</TD><TD>(等于)字符串比较测试</TD></TR><TR><TD><CODECLASS="OPTION">!==!</CODE></TD><TD>!=</TD><TD>(不等)字符串比较测试</TD></TR><TR><TD><CODECLASS="OPTION">|</CODE></TD><TD>|</TD><TD>管道</TD></TR><TR><TD><CODECLASS="OPTION">@</CODE></TD><TD>set <CODECLASS="OPTION">+v</CODE></TD><TD>不打印当前命令</TD></TR><TR><TD><CODECLASS="OPTION">*</CODE></TD><TD>*</TD><TD>文件名<SPANCLASS="QUOTE">"通配符"</SPAN></TD></TR><TR><TD><CODECLASS="OPTION">></CODE></TD><TD>></TD><TD>文件重定向(覆盖)</TD></TR><TR><TD><CODECLASS="OPTION">>></CODE></TD><TD>>></TD><TD>文件重定向(附加)</TD></TR><TR><TD><CODECLASS="OPTION"><</CODE></TD><TD><</TD><TD>重定向<TTCLASS="FILENAME">stdin</TT></TD></TR><TR><TD><CODECLASS="OPTION">%VAR%</CODE></TD><TD>$VAR</TD><TD>环境变量</TD></TR><TR><TD><CODECLASS="OPTION">REM</CODE></TD><TD>#</TD><TD>注释</TD></TR><TR><TD><CODECLASS="OPTION">NOT</CODE></TD><TD>!</TD><TD>取反</TD></TR><TR><TD><CODECLASS="OPTION">NUL</CODE></TD><TD><TTCLASS="FILENAME">/dev/null</TT></TD><TD><SPANCLASS="QUOTE">"黑洞"</SPAN>用来阻止命令输出</TD></TR><TR><TD><CODECLASS="OPTION">ECHO</CODE></TD><TD>echo</TD><TD>打印(Bash中有更多选项)</TD></TR><TR><TD><CODECLASS="OPTION">ECHO.</CODE></TD><TD>echo</TD><TD>打印空行</TD></TR><TR><TD><CODECLASS="OPTION">ECHO OFF</CODE></TD><TD>set <CODECLASS="OPTION">+v</CODE></TD><TD>不打印后续的命令</TD></TR><TR><TD><CODECLASS="OPTION">FOR %%VAR IN (LIST) DO</CODE></TD><TD>for var in [list]; do</TD><TD><SPANCLASS="QUOTE">"for"</SPAN>循环</TD></TR><TR><TD><CODECLASS="OPTION">:LABEL</CODE></TD><TD>没有等价物(多余)</TD><TD>标签</TD></TR><TR><TD><CODECLASS="OPTION">GOTO</CODE></TD><TD>没有等价物(使用函数)</TD><TD>跳转到脚本的另一个位置</TD></TR><TR><TD><CODECLASS="OPTION">PAUSE</CODE></TD><TD>sleep</TD><TD>暂停或等待一段时间</TD></TR><TR><TD><CODECLASS="OPTION">CHOICE</CODE></TD><TD>case or select</TD><TD>菜单选择</TD></TR><TR><TD><CODECLASS="OPTION">IF</CODE></TD><TD>if</TD><TD>if条件语句</TD></TR><TR><TD><CODECLASS="OPTION">IF EXIST <TTCLASS="REPLACEABLE"><I>FILENAME</I></TT></CODE></TD><TD>if [ -e filename ]</TD><TD>测试文件是否存在</TD></TR><TR><TD><CODECLASS="OPTION">IF !%N==!</CODE></TD><TD>if [ -z "$N" ]</TD><TD>参数<SPANCLASS="QUOTE">"N"</SPAN>是否存在</TD></TR><TR><TD><CODECLASS="OPTION">CALL</CODE></TD><TD>source命令或.(点操作符)</TD><TD><SPANCLASS="QUOTE">"include"</SPAN>另一个脚本</TD></TR><TR><TD><CODECLASS="OPTION">COMMAND /C</CODE></TD><TD>source命令或.(点操作符)</TD><TD><SPANCLASS="QUOTE">"include"</SPAN>另一个脚本(与CALL相同)</TD></TR><TR><TD><CODECLASS="OPTION">SET</CODE></TD><TD>export</TD><TD>设置一个环境变量</TD></TR><TR><TD><CODECLASS="OPTION">SHIFT</CODE></TD><TD>shift</TD><TD>左移命令行参数列表</TD></TR><TR><TD><CODECLASS="OPTION">SGN</CODE></TD><TD>-lt或-gt</TD><TD>(整形)符号</TD></TR><TR><TD><CODECLASS="OPTION">ERRORLEVEL</CODE></TD><TD>$?</TD><TD>退出状态</TD></TR><TR><TD><CODECLASS="OPTION">CON</CODE></TD><TD><TTCLASS="FILENAME">stdin</TT></TD><TD><SPANCLASS="QUOTE">"控制台"</SPAN>(<TTCLASS="FILENAME">stdin</TT>)</TD></TR><TR><TD><CODECLASS="OPTION">PRN</CODE></TD><TD><TTCLASS="FILENAME">/dev/lp0</TT></TD><TD>(一般的)打印设备</TD></TR><TR><TD><CODECLASS="OPTION">LPT1</CODE></TD><TD><TTCLASS="FILENAME">/dev/lp0</TT></TD><TD>第一个打印设备</TD></TR><TR><TD><CODECLASS="OPTION">COM1</CODE></TD><TD><TTCLASS="FILENAME">/dev/ttyS0</TT></TD><TD>第一个串口</TD></TR></TBODY></TABLE><HR></DIV><P>批处理文件一般都包含DOS命令. 我们必须把它转换为UNIX的等价命令, 这样我们才能把批处理文件转换为shell脚本文件. </P><DIVCLASS="TABLE"><HR><ANAME="AEN18933"></A><P><B>表格 L-2. DOS命令与UNIX的等价命令</B></P><TABLEBORDER="1"CLASS="CALSTABLE"><COL><COL><COL><THEAD><TR><TH>DOS命令</TH><TH>UNIX等价命令</TH><TH>效果</TH></TR></THEAD><TBODY><TR><TD><CODECLASS="OPTION">ASSIGN</CODE></TD><TD>ln</TD><TD>链接文件或目录</TD></TR><TR><TD><CODECLASS="OPTION">ATTRIB</CODE></TD><TD>chmod</TD><TD>修改文件权限</TD></TR><TR><TD><CODECLASS="OPTION">CD</CODE></TD><TD>cd</TD><TD>更换目录</TD></TR><TR><TD><CODECLASS="OPTION">CHDIR</CODE></TD><TD>cd</TD><TD>更换目录</TD></TR><TR><TD><CODECLASS="OPTION">CLS</CODE></TD><TD>clear</TD><TD>清屏</TD></TR><TR><TD><CODECLASS="OPTION">COMP</CODE></TD><TD>diff, comm, cmp</TD><TD>文件比较</TD></TR><TR><TD><CODECLASS="OPTION">COPY</CODE></TD><TD>cp</TD><TD>文件拷贝</TD></TR><TR><TD><CODECLASS="OPTION">Ctl-C</CODE></TD><TD>Ctl-C</TD><TD>中断(信号)</TD></TR><TR><TD><CODECLASS="OPTION">Ctl-Z</CODE></TD><TD>Ctl-D</TD><TD>EOF(文件结束)</TD></TR><TR><TD><CODECLASS="OPTION">DEL</CODE></TD><TD>rm</TD><TD>删除文件</TD></TR><TR><TD><CODECLASS="OPTION">DELTREE</CODE></TD><TD>rm -rf</TD><TD>递归删除目录</TD></TR><TR><TD><CODECLASS="OPTION">DIR</CODE></TD><TD>ls -l</TD><TD>列出目录内容</TD></TR><TR><TD><CODECLASS="OPTION">ERASE</CODE></TD><TD>rm</TD><TD>删除文件</TD></TR><TR><TD><CODECLASS="OPTION">EXIT</CODE></TD><TD>exit</TD><TD>退出当前进程</TD></TR><TR><TD><CODECLASS="OPTION">FC</CODE></TD><TD>comm, cmp</TD><TD>文件比较</TD></TR><TR><TD><CODECLASS="OPTION">FIND</CODE></TD><TD>grep</TD><TD>在文件中查找字符串</TD></TR><TR><TD><CODECLASS="OPTION">MD</CODE></TD><TD>mkdir</TD><TD>新建目录</TD></TR><TR><TD><CODECLASS="OPTION">MKDIR</CODE></TD><TD>mkdir</TD><TD>新建目录</TD></TR><TR><TD><CODECLASS="OPTION">MORE</CODE></TD><TD>more</TD><TD>分页显示文本文件</TD></TR><TR><TD><CODECLASS="OPTION">MOVE</CODE></TD><TD>mv</TD><TD>移动文件</TD></TR><TR><TD><CODECLASS="OPTION">PATH</CODE></TD><TD>$PATH</TD><TD>可执行文件的路径</TD></TR><TR><TD><CODECLASS="OPTION">REN</CODE></TD><TD>mv</TD><TD>重命名(移动)</TD></TR><TR><TD><CODECLASS="OPTION">RENAME</CODE></TD><TD>mv</TD><TD>重命名(移动)</TD></TR><TR><TD><CODECLASS="OPTION">RD</CODE></TD><TD>rmdir</TD><TD>删除目录</TD></TR><TR><TD><CODECLASS="OPTION">RMDIR</CODE></TD><TD>rmdir</TD><TD>删除目录</TD></TR><TR><TD><CODECLASS="OPTION">SORT</CODE></TD><TD>sort</TD><TD>排序文件</TD></TR><TR><TD><CODECLASS="OPTION">TIME</CODE></TD><TD>date</TD><TD>显示系统时间</TD></TR><TR><TD><CODECLASS="OPTION">TYPE</CODE></TD><TD>cat</TD><TD>将文件输出到<TTCLASS="FILENAME">stdout</TT></TD></TR><TR><TD><CODECLASS="OPTION">XCOPY</CODE></TD><TD>cp</TD><TD>(扩展的)文件拷贝</TD></TR></TBODY></TABLE><HR></DIV><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>事实上, 几乎所有的UNIX和shell操作符, 还有命令都有许多的选项, 对比DOS和批处理文件来说, 它们要强大的多. 许多DOS批处理文件都需要依靠辅助工具, 比如<BCLASS="COMMAND">ask.com</B>, 这是一个比<AHREF="internal.html#READREF">read</A>命令差很多的类似副本. </P><P>DOS对于文件名<AHREF="globbingref.html">通配符扩展</A>支持的非常有限, 并且很不完整, 仅仅识别<SPANCLASS="TOKEN">*</SPAN>和<SPANCLASS="TOKEN">?</SPAN>. </P></TD></TR></TABLE></DIV><P>将DOS批处理文件转换为sehll脚本, 通常是一件很简单的事情, 而且转换的结果通常都比原始的批处理文件好. </P><DIVCLASS="EXAMPLE"><HR><ANAME="VIEWDAT"></A><P><B>例子 L-1. VIEWDATA.BAT: DOS批处理文件</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 REM VIEWDATA 2 3 REM 灵感来自于例子"DOS POWERTOOLS" 4 REM PAUL SOMERSON编写 5 6 7 @ECHO OFF 8 9 IF !%1==! GOTO VIEWDATA 10 REM 如果没有命令行参数... 11 FIND "%1" C:\BOZO\BOOKLIST.TXT 12 GOTO EXIT0 13 REM 打印出字符串匹配的行, 然后退出. 14 15 :VIEWDATA 16 TYPE C:\BOZO\BOOKLIST.TXT | MORE 17 REM 显示整个文件, 一次一页. 18 19 :EXIT0</PRE></FONT></TD></TR></TABLE><HR></DIV><P>转换脚本作了一些改进. </P><DIVCLASS="EXAMPLE"><HR><ANAME="VIEWDATA"></A><P><B>例子 L-2. viewdata.sh: 转换自VIEWDATA.BAT的shell脚本</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # viewdata.sh 3 # 转换自VIEWDATA.BAT的shell脚本. 4 5 DATAFILE=/home/bozo/datafiles/book-collection.data 6 ARGNO=1 7 8 # @ECHO OFF 这个命令在这里就不需要了. 9 10 if [ $# -lt "$ARGNO" ] # IF !%1==! GOTO VIEWDATA 11 then 12 less $DATAFILE # TYPE C:\MYDIR\BOOKLIST.TXT | MORE 13 else 14 grep "$1" $DATAFILE # FIND "%1" C:\MYDIR\BOOKLIST.TXT 15 fi 16 17 exit 0 # :EXIT0 18 19 # 跳转, 标签, 还有其他一些小手段, 在shell脚本中就不需要了. 20 # 我们可以说, 转换后的脚本比原始批处理文件好的多, 21 #+ 它更短, 看起来更整洁, 更优雅. </PRE></FONT></TD></TR></TABLE><HR></DIV><P>Ted Davis的<AHREF="http://www.maem.umr.edu/~batch/"TARGET="_top">Shell Scripts on the PC</A>站点上有许多关于老式的批处理文件编程的教程, 他使用的某些独创性的技术, 和shell脚本有异曲同工之妙. </P></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="sample-bashrc.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="exercises.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">一个简单的<TTCLASS="FILENAME">.bashrc</TT>文件</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"> </TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">练习</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -