免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1351 | 回复: 4
打印 上一主题 下一主题

[文本处理] LINUX与UNIX_Shell编程指南第22章中删除记录示例中的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-26 17:24 |只看该作者 |倒序浏览
本帖最后由 cheungjan 于 2012-08-26 17:26 编辑

学习shell编程指南中第二十二章中遇到关于删除记录的问题

书籍中介绍了删除文档的几个过程:
要从文件中删除记录,首先要将记录传给用户以确保该记录是正确删除的记录。得到确
认后才执行下列任务:
1) 查询记录。
2) 显示记录。
3) 确认删除。
4) 修改文件。
完整脚本如下
  1. #!/bin/sh
  2. #dbase_del
  3. #delete a  record
  4.        
  5. #trap signals
  6. trap "" 2 3 15
  7. #DATAFILE
  8. DBFILE=DBFILE
  9.        
  10. #temp files
  11. HOLD1=HOLD1.$
  12. HOLD2=HOLD2.$
  13.        
  14. continue_promptYN()
  15. {
  16. #continue_prompt
  17. _STR=$1
  18. _DEFAULT=$2
  19. #check we have the right params
  20. if [ $# -lt 1 ];then
  21.         echo "continue_prompt: I need a string to display"
  22.         return 1
  23. fi
  24. while :
  25. do
  26.         echo -n "$_STR [Y..N] [$_DEFAULT]:"
  27.         read _ANS
  28.         : ${_ANS:=$_DEFAULT}
  29.         if [ "$_ANS" = "" ];then
  30.                 case $_ANS in
  31.                 Y) return 0;;
  32.                 N) return 1;;
  33.                 esac
  34.         fi
  35.         case $_ANS in
  36.         y|Y|Yes|YES)
  37.                 return 0
  38.                 ;;
  39.         n|N|NO|no)
  40.                 return 1
  41.                 ;;
  42.         *) echo "Answer either Y or N,Default is $_DEFAULT"
  43.                 ;;
  44.         esac
  45. done
  46. }

  47. display_rec()
  48. {
  49. #display_rec
  50. #could use cat << here document
  51. tput cup 5 3
  52. echo -e "\n"
  53. echo "EMPLOYEE NO        : $CODE"
  54. echo "FIRST NAME        : $F_NAME"
  55. echo "SURNAME                : $S_NAME"
  56. echo "DEPARTMENT        : $DEPART"
  57. echo -e "\n\n"
  58. }

  59. no_recs()
  60. {
  61. #no_recs
  62. echo -e "\n\nSorry could not find a record with the name $STR"
  63. }

  64. get_rec()
  65. {
  66. #get_rec
  67. clear
  68. echo -n "Enter the employee surname:"
  69. read STR
  70. if [ "$STR" = "q" ];then
  71.         return 1
  72. fi

  73. REC=0
  74. MATCH=no
  75. if [ "$STR" != "" ];then
  76.         while read CODE F_NAME S_NAME DEPART
  77.         do
  78.                 REC=`expr $REC + 1`
  79.                 tput cup 3 4
  80.                 echo -n "Searching record..$REC"
  81.                 if [ "$S_NAME" = "$STR" ];then
  82.                         MATCH=yes
  83.                         display_rec
  84.                         break
  85.                 else
  86.                         continue
  87.                 fi
  88.         done <$DBFILE
  89. else
  90.         echo "Enter a surname to search for or q to quit"
  91. fi
  92. if [ "$MATCH" = "no" ];then
  93.         no_recs
  94. fi
  95. }       
  96. SAVEDIFS=$IFS
  97. IFS=:
  98. get_rec
  99. if [ "$MATCH" = "yes" ];then
  100.         if continue_promptYN "Do You Wish To Delete This Record" "N";then
  101.                 echo "DEL"
  102.                 grep -v $STR DBFILE >$HOLD1 2> /dev/null
  103.                 if [ $? -ne 0 ];then
  104.                         echo "Problems creating team file $HOLD1..check it out"
  105.                         exit 1
  106.                 fi
  107.                 mv $HOLD1 DBFILE
  108.                 if [ $? -ne 0 ];then
  109.                         echo "Problems moving temp file..check it out"
  110.                         exit 1
  111.                 fi
  112.                 #sort the file after changes
  113.                 sort -k1 -n -t: $DBFILE >$HOLD2 2> /dev/null
  114.                 if [ $? -ne 0 ];then
  115.                         echo "Problems trying to sort the file..check it out"
  116.                         exit 1
  117.                 fi
  118.                 mv $HOLD2 $DBFILE
  119.                 if [ $? -ne 0 ];then
  120.                         echo "Problems moving the temp sort file..check it out"
  121.                         exit 1
  122.                 fi
  123.                 else
  124.                         echo "no deletion"
  125.                         #no deletion
  126.                 fi # if wish to delete
  127.         fi # if match
  128. #restore IFS settings
  129. IFS=$SAVEIFS
复制代码
自己创建的DBFILE内容如下
  1. 1:China:Unix:accounts
  2. 2:Hello:World:claims
  3. 3:City:China:sales
  4. 4:China:Linux:sales
  5. 5:A:J:IT
  6. 6:C:J:SALES
  7. 7:S:B:sales
  8. 8:Hello:Kitty:it
  9. 9:In:City:it
复制代码
执行该程序的时候
  1. Enter the employee surname:J


  2.     Searching record..5



  3. EMPLOYEE NO        : 5
  4. FIRST NAME        : A
  5. SURNAME        : J
  6. DEPARTMENT        : IT



  7. Do You Wish To Delete This Record [Y..N] [N]:
复制代码
如果选择Y
  1. Do You Wish To Delete This Record [Y..N] [N]:Y
  2. DEL
  3. cj@cj-thinkpadx201i:~$ cat DBFILE
  4. 1:China:Unix:accounts
  5. 2:Hello:World:claims
  6. 3:City:China:sales
  7. 4:China:Linux:sales
  8. 7:S:B:sales
  9. 8:Hello:Kitty:it
  10. 9:In:City:it
复制代码
则Surname是J的都被删除了。
疑问是如何修改程序在使用查询条件后显示所有匹配的结果。
比如选择Surname 是J,应该
  1. EMPLOYEE NO        : 5
  2. FIRST NAME        : A
  3. SURNAME        : J
  4. DEPARTMENT        : IT

  5. EMPLOYEE NO        : 6
  6. FIRST NAME        : C
  7. SURNAME        : J
  8. DEPARTMENT        : SALES
复制代码
这两个都符合条件的显示出来。

按照书中示例结果是显示第一个匹配的结果,如果删除改匹配的条件反而是所有符合条件的都删除了


请各位指点指点。。谢谢



论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 2012-08-27 09:41 |只看该作者
你把调用 display_rec 后的break 命令注释掉,就可以看到所有符合 surname 的记录了。

论坛徽章:
0
3 [报告]
发表于 2012-08-27 18:55 |只看该作者
回复 2# rdcwayx

尝试几次单纯break屏蔽掉还是不能达到预期显示效果,把
  1.     display_rec()
  2. {
  3. #display_rec
  4. #could use cat << here document
  5. #tput cup 5 3
  6. echo -e "\n\n"
  7. echo "EMPLOYEE NO        : $CODE"
  8. echo "FIRST NAME        : $F_NAME"
  9. echo "SURNAME                : $S_NAME"
  10. echo "DEPARTMENT        : $DEPART"
  11. #echo -e "\n"
  12. }
复制代码
里的tput 坐标定位语句屏蔽掉,这样结合屏蔽掉的break语句能够显示所有符合条件数据,不过排版上一个echo -n -e "Searching record..$REC"和另外一个"Do You Wish To Delete This Record" "N"还是会错乱,调试了半天总是达不到预期效果。。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
4 [报告]
发表于 2012-08-28 07:55 |只看该作者
自己调试效果最好, 这个代码不难,吃透每行命令的意思,你应该可以自己搞定的。

论坛徽章:
0
5 [报告]
发表于 2012-08-28 08:40 |只看该作者
回复 4# rdcwayx 谢谢版主建议,昨天结合set -x 调试了一会,还好基本达到自己的需求了。



   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP