免费注册 查看新帖 |

Chinaunix

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

请教一个关于变量的事 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-19 21:51 |只看该作者 |倒序浏览
有两个文本文件: a.txt  b.txt 用这两文件的内容,
想通过菜单选择序号在b.txt文本中找出与所选项相近的所有行,并生成 c.txt。
现在是有个变量的值取有问题,
是倒数第七行的if [ "$s_xz" -lt "$s_tn" ]; then ,这个$s_tn取值应该是a.txt的行数+1,但它取的却是1 。
请朋友们帮我看一看,我弄一天了也没弄好,先谢谢了!
忘记说了,这是在UNIX5.05是运行的。

a.txt内容
AAA
BBB
CCC
DDD
......

b.txt内容
AAAfdsfd56456
AAAhgfdhgfhgfd
AAA......
BBBjgkf;hjgk
BBB......
CCCyreuoyw
CCCuroeptop
CCC......
DDD......




程序如下:
while :
do
clear
echo '测试菜单'
echo '====================='
s_tn=1    ##序号
while read s_zhm      
do
  echo " "$s_tn. $s_zhm
  s_tn=`expr $s_tn + 1`
done <a.txt         ##显示全部内容,在各行前自动加序号
echo "======================="
echo -n "请选择(0退出):"
read s_xz
    case $s_xz in     ##第一层选择
         0) break ;;
         $s_xz)
           if expr $s_xz + 10 >/dev/null 2>&1
           then :
           else
           exit ;
           fi
             if [ "$s_xz" -lt "$s_tn" ]; then
             s_go=`head -$s_xz a.txt | tail -1`
             grep $s_go b.txt >c.tmp
            
    *) clear
      break ;;
  esac
  done

[ 本帖最后由 jixi_bobo 于 2007-11-19 22:10 编辑 ]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2007-11-20 08:03 |只看该作者
1.是不是实现的 grep -Ff a.txt b.txt的功能?


2.while read s_zhm      
do
  echo " "$s_tn. $s_zhm
  s_tn=`expr $s_tn + 1`
done <a.txt
这个改成下面的试试

exec 3<a.txt
while read <&3      
do
  echo " "$s_tn. $s_zhm
  s_tn=`expr $s_tn + 1`
done

论坛徽章:
0
3 [报告]
发表于 2007-11-30 21:14 |只看该作者
谢谢waker,不是你说的那样子的

运行后显示的是
   测试菜单
  1.AAA
   2.BBB
   3.CCC
   4.DDD
   5.……
请选择:
  
“如果选择主菜单的2,那么将生成c.txt,内容应该是b.txt文件中的以BBB开头的所有行”
我用  if [ "$s_xz" -lt "$s_tn" ]; then  这句主要是想限制所选择的序号不能大于主菜单的最后的那个序号。
可是运行到这步时,不管主菜单是多少个序号,$s_tn的值都是1,这样选择序号几都大于1,所以程序都不再运行下去。

有时间的朋友们都再帮我看看怎么办,先谢谢了

[ 本帖最后由 jixi_bobo 于 2007-11-30 21:17 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-11-30 21:44 |只看该作者
是不是想达到这个效果?

  1. #!/bin/bash
  2. while [ 1 ]
  3. do
  4.         clear
  5.         echo '测试菜单'
  6.         echo '====================='
  7.         select s in $(<a.txt) 退出
  8.         do
  9.                 [  "X$s" != "X退出" -a ! -z "$s"  ] && grep "^$s" b.txt >c.txt
  10.                 break
  11.         done
  12.         [  "X$s" == "X退出"  ] && break
  13. done
复制代码


注: 当选择不在列表中的数字的时候,就返回空

[ 本帖最后由 springwind426 于 2007-11-30 21:50 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-11-30 22:04 |只看该作者
对,大致是这样子的,我明天单位试一下,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP