关于Bash---DOS到shell的转换

本文介绍了如何将DOS批处理转换为Bash shell脚本,通过等价变换的方法,并提供了一些参考资料,包括《CMD命令行高级教程》和《Advanced Bash-Scripting Guide》的中文翻译版链接。作者强调了在Linux/Unix环境下学习shell的重要性,并分享了使用vi编辑器进行全局替换的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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"黑洞"用来阻止命令输出
ECHOecho打印(Bash中有更多选项)
ECHO.echo打印空行
ECHO OFFset +v不打印后续的命令
FOR %%VAR IN (LIST) DOfor var in [list]; do"for"循环
:LABEL没有等价物(多余)标签
GOTO没有等价物(使用函数)跳转到脚本的另一个位置
PAUSEsleep暂停或等待一段时间
CHOICEcase or select菜单选择
IFifif条件语句
IF EXIST FILENAMEif [ -e filename ]测试文件是否存在
IF !%N==!if [ -z "$N" ]参数"N"是否存在
CALLsource命令或.(点操作符)"include"另一个脚本
COMMAND /Csource命令或.(点操作符)"include"另一个脚本(与CALL相同)
SETexport设置一个环境变量
SHIFTshift左移命令行参数列表
SGN-lt或-gt(整形)符号
ERRORLEVEL$?退出状态
CONstdin"控制台"(stdin)
PRN/dev/lp0(一般的)打印设备
LPT1/dev/lp0第一个打印设备
COM1/dev/ttyS0第一个串口

表格 L-2. DOS命令与UNIX的等价命令

DOS命令UNIX等价命令效果
ASSIGNln链接文件或目录
ATTRIBchmod修改文件权限
CDcd更换目录
CHDIRcd更换目录
CLSclear清屏
COMPdiff, comm, cmp文件比较
COPYcp文件拷贝
Ctl-CCtl-C中断(信号)
Ctl-ZCtl-DEOF(文件结束)
DELrm删除文件
DELTREErm -rf递归删除目录
DIRls -l列出目录内容
ERASErm删除文件
EXITexit退出当前进程
FCcomm, cmp文件比较
FINDgrep在文件中查找字符串
MDmkdir新建目录
MKDIRmkdir新建目录
MOREmore分页显示文本文件
MOVEmv移动文件
PATH$PATH可执行文件的路径
RENmv重命名(移动)
RENAMEmv重命名(移动)
RDrmdir删除目录
RMDIRrmdir删除目录
SORTsort排序文件
TIMEdate显示系统时间
TYPEcat将文件输出到stdout
XCOPYcp(扩展的)文件拷贝

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

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值