LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 774|回复: 7

对这个脚本的一点疑问

[复制链接]
发表于 2003-6-7 08:32:54 | 显示全部楼层 |阅读模式
#!/bin/ksh
# Script name: Speller
#
#
# Purpose: Check and fix spelling errors in a file
#

exec < tmp   # opens the tmp file
while read line  # read from the tmp file
do
print $line
print -n "Is this word correct? [Y/N] "
read answer < /dev/tty  # read from the terminal
    case $answer in
    [Yy]*)
        continue
            ;;
    *)
        print "New word? "
        read word < /dev/tty
        sed "s/$line/$word/" tmp > error
        mv error tmp
        print $word has been changed.
            ;;
    esac
done
电脑里不是有一个words么?grep一下它多好!
发表于 2003-6-7 10:26:59 | 显示全部楼层
我想这个脚本是用来练习的,没什么实用意义

电脑里不是有一个words么?grep一下它多好!

是个好主意
发表于 2003-6-7 11:29:58 | 显示全部楼层
LY说得对,这就是exec和read配合使用的一个练习而已!
 楼主| 发表于 2003-6-7 21:17:48 | 显示全部楼层
/usr/share/dict/words
发表于 2003-6-7 23:03:53 | 显示全部楼层
此脚本中的word是接收用户从终端输入的一个变量名,是任意起的!而非你所说的那个linux.words文件!
 楼主| 发表于 2003-6-8 09:30:11 | 显示全部楼层
Of course i know. But if the line(with word) is changed like sth "grep $line</usr/share/dict/words", it will be better.
发表于 2003-6-8 14:33:22 | 显示全部楼层

  1. #!/bin/ksh
  2. # Script name: Speller
  3. #
  4. #
  5. # Purpose: Check and fix spelling errors in a file
  6. # 用途从文件tmp每次读取一行文字来做交互式的校验

  7. exec < tmp          # exec:唤起一个进程
  8.                     # 把tmp文件置于当前进程的输入端
  9. while read line     # read line:(暗示了从当前的输入端中)读取一行文字存入line变量内
  10.                     # while循环每次开始前检厕read返回值
  11.                     # 文件读取成功返回真,读置文件尾部时文件结束返回非真
  12.                     #[语义1]打开文件tmp每次从文件中取一行读入line变量,然后进入下列循环
  13.                     
  14. do                  # 与尾部的done对应形成while循环的循环体
  15.     print $line     # 向当前输出(屏幕)打印line变量内容 line变量存放的是tmp文件当前行内容
  16.     print -n "Is this word correct? [Y/N] "
  17.     read answer < /dev/tty # read from the terminal
  18.                     # 从/dev/tty设备(就是终端设备,你的键盘)读取用户输入,
  19.                     # 注意!此处因为特别指定了一个输入端,所以不再是从默认输入端tmp文件中读取输入
  20.                     #[语义2]显示当前行内容,并提示判断当前行是否正确,输入是还是不是

  21. case $answer in     # CASE语句
  22.                     # 对用户的输入做反馈
  23.     [Yy]*)          # [Yy]*是一个正则表达式,匹配以Y或y开头的任意字串。 “)”是case语句关键字 表示一个CASE选项开始                  
  24.         continue    # 当前while循环继续 continue是循环语句关键字
  25.         ;;          # “;;”是case语句关键字 表示一个CASE选项接受
  26.                     #[语义3]如果用户输入了Y/y则循环继续
  27.                     
  28.     *)              # *匹配任意字串,从上下文讲这里实际上是讲除Y/y之外的其他输入
  29.         print "New word? "      
  30.         read word < /dev/tty   
  31.                     # 同上
  32.         sed "s/$line/$word/" tmp > error
  33.                     # sed语句 在文件tmp中全局用变量$word内容替换变量$line内容 然后输出到文件error中去
  34.                     # sed语句是每次读取一行进行编辑
  35.                     # 此处有BUG,如果tmp文件中有多行内容为$line,则将全部被替换为$word,
  36.                     # 解决方法可以是增加一个变量$linenum记录当前行号,语句修改为sed "s/$line/$word/$linenum,$linenum" tmp > error                  
  37.         mv error tmp
  38.                     # 用error文件覆盖tmp文件
  39.         print $word has been changed.
  40.         ;;
  41.                     #[语义4]如果用户输入了除Y/y以外的字符,则提示用户输入新的内容来替换当前行的内容
  42. esac                # case结束
  43. done                # while结束
复制代码

代码其实很简单,之所以作注释,一是检测个人对SHELL语句的理解深度和表达能力(当作一个考试题),二是希望通过大家修改做为一个入门教材

请各位深入细节,指出注释中差错

发表于 2003-6-8 17:53:25 | 显示全部楼层
谢谢dreamrise兄详实的解释!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表