|
发表于 2003-6-8 14:33:22
|
显示全部楼层
- #!/bin/ksh
- # Script name: Speller
- #
- #
- # Purpose: Check and fix spelling errors in a file
- # 用途从文件tmp每次读取一行文字来做交互式的校验
- exec < tmp # exec:唤起一个进程
- # 把tmp文件置于当前进程的输入端
- while read line # read line:(暗示了从当前的输入端中)读取一行文字存入line变量内
- # while循环每次开始前检厕read返回值
- # 文件读取成功返回真,读置文件尾部时文件结束返回非真
- #[语义1]打开文件tmp每次从文件中取一行读入line变量,然后进入下列循环
-
- do # 与尾部的done对应形成while循环的循环体
- print $line # 向当前输出(屏幕)打印line变量内容 line变量存放的是tmp文件当前行内容
- print -n "Is this word correct? [Y/N] "
- read answer < /dev/tty # read from the terminal
- # 从/dev/tty设备(就是终端设备,你的键盘)读取用户输入,
- # 注意!此处因为特别指定了一个输入端,所以不再是从默认输入端tmp文件中读取输入
- #[语义2]显示当前行内容,并提示判断当前行是否正确,输入是还是不是
- case $answer in # CASE语句
- # 对用户的输入做反馈
- [Yy]*) # [Yy]*是一个正则表达式,匹配以Y或y开头的任意字串。 “)”是case语句关键字 表示一个CASE选项开始
- continue # 当前while循环继续 continue是循环语句关键字
- ;; # “;;”是case语句关键字 表示一个CASE选项接受
- #[语义3]如果用户输入了Y/y则循环继续
-
- *) # *匹配任意字串,从上下文讲这里实际上是讲除Y/y之外的其他输入
- print "New word? "
- read word < /dev/tty
- # 同上
- sed "s/$line/$word/" tmp > error
- # sed语句 在文件tmp中全局用变量$word内容替换变量$line内容 然后输出到文件error中去
- # sed语句是每次读取一行进行编辑
- # 此处有BUG,如果tmp文件中有多行内容为$line,则将全部被替换为$word,
- # 解决方法可以是增加一个变量$linenum记录当前行号,语句修改为sed "s/$line/$word/$linenum,$linenum" tmp > error
- mv error tmp
- # 用error文件覆盖tmp文件
- print $word has been changed.
- ;;
- #[语义4]如果用户输入了除Y/y以外的字符,则提示用户输入新的内容来替换当前行的内容
- esac # case结束
- done # while结束
复制代码
代码其实很简单,之所以作注释,一是检测个人对SHELL语句的理解深度和表达能力(当作一个考试题),二是希望通过大家修改做为一个入门教材
请各位深入细节,指出注释中差错
|
|