1.缘起
由于从windows转向Ubuntu以及自身项目的的原因,需要学习shell,而Linux中默认的shell就是大名鼎鼎的bash。因为项目的原因,发现需要将一个dos的批处理修改为shell脚本。自身的知识不是很过硬,就google了一下。
2.将DOS的批处理转换为shell脚本
关于DOS或者是现代的windows机器上的DOS模拟器cmd程序,百度文库有《CMD命令行高级教程》,是一个有介绍有实例的教程,其中的实例都是可以运行的,我自己学习时参考了一下。链接如下:http://wenku.baidu.com/view/f74997c06137ee06eff91849.html。 将DOS转换为Shell其实就是类似数学的等价变换的,给出一一对应的关系即可。
表格 L-1. 批处理文件关键字 / 变量 / 操作符, 和等价的shell符号
批处理文件操作符 | Shell脚本等价符号 | 含义 |
---|---|---|
% | $ | 命令行参数前缀 |
/ | - | 命令选项标记 |
\ | / | 目录路径分隔符 |
== | = | (等于)字符串比较测试 |
!==! | != | (不等)字符串比较测试 |
| | | | 管道 |
@ | set +v | 不打印当前命令 |
* | * | 文件名"通配符" |
> | > | 文件重定向(覆盖) |
>> | >> | 文件重定向(附加) |
< | < | 重定向stdin |
%VAR% | $VAR | 环境变量 |
REM | # | 注释 |
NOT | ! | 取反 |
NUL | /dev/null | "黑洞"用来阻止命令输出 |
ECHO | echo | 打印(Bash中有更多选项) |
ECHO. | echo | 打印空行 |
ECHO OFF | set +v | 不打印后续的命令 |
FOR %%VAR IN (LIST) DO | for var in [list]; do | "for"循环 |
:LABEL | 没有等价物(多余) | 标签 |
GOTO | 没有等价物(使用函数) | 跳转到脚本的另一个位置 |
PAUSE | sleep | 暂停或等待一段时间 |
CHOICE | case or select | 菜单选择 |
IF | if | if条件语句 |
IF EXIST FILENAME | if [ -e filename ] | 测试文件是否存在 |
IF !%N==! | if [ -z "$N" ] | 参数"N"是否存在 |
CALL | source命令或.(点操作符) | "include"另一个脚本 |
COMMAND /C | source命令或.(点操作符) | "include"另一个脚本(与CALL相同) |
SET | export | 设置一个环境变量 |
SHIFT | shift | 左移命令行参数列表 |
SGN | -lt或-gt | (整形)符号 |
ERRORLEVEL | $? | 退出状态 |
CON | stdin | "控制台"(stdin) |
PRN | /dev/lp0 | (一般的)打印设备 |
LPT1 | /dev/lp0 | 第一个打印设备 |
COM1 | /dev/ttyS0 | 第一个串口 |
表格 L-2. DOS命令与UNIX的等价命令
DOS命令 | UNIX等价命令 | 效果 |
---|---|---|
ASSIGN | ln | 链接文件或目录 |
ATTRIB | chmod | 修改文件权限 |
CD | cd | 更换目录 |
CHDIR | cd | 更换目录 |
CLS | clear | 清屏 |
COMP | diff, comm, cmp | 文件比较 |
COPY | cp | 文件拷贝 |
Ctl-C | Ctl-C | 中断(信号) |
Ctl-Z | Ctl-D | EOF(文件结束) |
DEL | rm | 删除文件 |
DELTREE | rm -rf | 递归删除目录 |
DIR | ls -l | 列出目录内容 |
ERASE | rm | 删除文件 |
EXIT | exit | 退出当前进程 |
FC | comm, cmp | 文件比较 |
FIND | grep | 在文件中查找字符串 |
MD | mkdir | 新建目录 |
MKDIR | mkdir | 新建目录 |
MORE | more | 分页显示文本文件 |
MOVE | mv | 移动文件 |
PATH | $PATH | 可执行文件的路径 |
REN | mv | 重命名(移动) |
RENAME | mv | 重命名(移动) |
RD | rmdir | 删除目录 |
RMDIR | rmdir | 删除目录 |
SORT | sort | 排序文件 |
TIME | date | 显示系统时间 |
TYPE | cat | 将文件输出到stdout |
XCOPY | cp | (扩展的)文件拷贝 |
3.一个实例
REM VIEWDATA
REM 灵感来自于例子"DOS POWERTOOLS"
REM PAUL SOMERSON编写
@ECHO OFF
IF !%1==! GOTO VIEWDATA
REM 如果没有命令行参数...
FIND "%1" C:\BOZO\BOOKLIST.TXT
GOTO EXIT0
REM 打印出字符串匹配的行, 然后退出.
:VIEWDATA
TYPE C:\BOZO\BOOKLIST.TXT | MORE
REM 显示整个文件, 一次一页.
:EXIT0
转换脚本
#!/bin/bash
# viewdata.sh
# 转换自VIEWDATA.BAT的shell脚本.
DATAFILE=/home/bozo/datafiles/book-collection.data
ARGNO=1
# @ECHO OFF 这个命令在这里就不需要了.
if [ $# -lt "$ARGNO" ] # IF !%1==! GOTO VIEWDATA
then
less $DATAFILE # TYPE C:\MYDIR\BOOKLIST.TXT | MORE
else
grep "$1" $DATAFILE # FIND "%1" C:\MYDIR\BOOKLIST.TXT
fi
exit 0 # :EXIT0
# 跳转, 标签, 还有其他一些小手段, 在shell脚本中就不需要了.
# 我们可以说, 转换后的脚本比原始批处理文件好的多,
# 它更短, 看起来更整洁, 更优雅.
4. 小结
在Linux/Unix的环境中,学习shell是很有必要的,如果想要深入理解系统的行为的话,可以考虑去看看Linux系统中的一些启动脚本(shell编写的),获取关于系统进一步的理解和认识。
在google“DOS批处理转换为shell” 时,发现一个不错的站点,是国内的Linux使用者翻译的《Advanced Bash-Scripting Guide》,稍微看一看,确实是一本很牛叉的书(英文版大概800多页的样子),关于本文中除了题记和小结,其它都是直接copy的那个网站的上的。
以下是它的网址:http://www.21andy.com/manual/advanced-bash-scripting-guide/index.html 有兴趣的可以参考一下。(注意:其网页编码是GBK,查看时需要设置页面编码为GBK或者GB2312)
关于我自己转换的那个批处理处理文件由于太过冗长(一百多行的样子),所以没有贴出来。作为一个大部分都是copy的别人文章的材料的博文,请原谅我把设为原创,因为我觉得至少布局是自己想的,还有点原创的成分的,虽然只有不到20%。
在将DOS批处理转换为shell的时候,使用vi编辑器的的全局替换功能将会非常的方便(个人经验)。 在vi的命令模式下,命令格式如下 :g/search-pattern/s/old/new/g 或其简化版的 :g/search-pattern/s//new/g.
5. 参考资料
[1].CMD命令行高级编程, 百度文库,http://wenku.baidu.com/view/f74997c06137ee06eff91849.html
[2].Advanced Bash-Scripting Guide,中文版翻译,http://www.21andy.com/manual/advanced-bash-scripting-guide/index.html