免费注册 查看新帖 |

Chinaunix

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

跳出循环,变量值消失. SOS [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-08-03 11:43 |只看该作者 |倒序浏览
碰到一个问题. 代码如下:
LINENO=1
while [ 1 ]
do
        LINE=`sed -n -e "$LINENO p" $3`
        echo "$LINE"
done < $3
echo "line number = $LINENO"


当跳出循环, LINENO值变为1. 求教如何能保留值在循环外.

论坛徽章:
0
2 [报告]
发表于 2003-08-03 11:51 |只看该作者

跳出循环,变量值消失. SOS

原帖由 "cs221313" 发表:

        LINE=`sed -n -e "$LINENO p" $3`
        echo "$LINE"
done < $3
echo "line number = $LINENO"


当跳出循环, LINENO值变为1. 求教如何能保留值在循环外.
   

shell处理重定向的循环时把循环代码用子shell来执行 ,export一下应该可以了。

论坛徽章:
0
3 [报告]
发表于 2003-08-03 12:21 |只看该作者

跳出循环,变量值消失. SOS

还是不行. 我改成如下:
LINENO=1
export LINENO
while [ 1 ]
do
LINE=`sed -n -e "$LINENO p" $3`
echo "$LINE"
done < $3
echo "line number = $LINENO"


或把他放到循环了还是不行. thanks anyways.

论坛徽章:
0
4 [报告]
发表于 2003-08-03 12:28 |只看该作者

跳出循环,变量值消失. SOS

你这段代码是干什么用的?

论坛徽章:
0
5 [报告]
发表于 2003-08-03 12:37 |只看该作者

跳出循环,变量值消失. SOS

下面是整个代码: 是一个将input 传给一程序, 然后和一个output文件比较. 列出不一样的test case.

INDEX=1
LAST_INDEX=1
CASENO=1
LINENO=1
if [ $# -ne 3 ]
then
        echo "Usage: tester executable_file_name input_file_name output_file_name."
        exit 0
fi
if [ ! -x $1 ]
then
        echo "$1 is not an executable file."
fi
if [ ! -r $2 ]
then
        echo "$2 is not a readable file."
fi
if [ ! -r $3 ]
then
        echo "$3 is not a readable file."
fi
TOTALLINE=`wc -l $3 | sed "s/ $3$//" | sed "s/^       //"`
readonly TOTALLINE
for TOKEN in `cat $2`
do
        EXP="$EXP $TOKEN"
        if [ $TOKEN = "=" -o $TOKEN = "==" ]
        then
                if [ ! -w /tmp/tmp2$$ ]
                then
                        echo "=========" > /tmp/tmp2$$
                else
                        echo "=========" >> /tmp/tmp2$$
                fi
                echo $EXP | $1 >> /tmp/tmp2$$
                echo "RC=$?" >>/tmp/tmp2$$
                #read one output of test case and put it in /tmp/tmp$$ file. Then cut
                #these lines.
                while [ 1 ]
                do
                        LINE=`sed -n -e "$LINENO p" $3`
                        echo "$LINE"
                        LINENO=`expr $LINENO + 1`
                        export LINENO
                        echo "line number = $LINENO"
                        if [ ! -w /tmp/tmp1$$ ]
                        then
                                echo $LINE >/tmp/tmp1$$
                        else
                                echo $LINE >>/tmp/tmp1$$
                        fi
                        THREECHAR=`echo $LINE | cut -c1-3`
                        #echo $THREECHAR
                        if [ $THREECHAR = "RC=" ]
                        then
                                break
                        fi
                done < $3
                unset EXP
                if [ "`diff /tmp/tmp1$$ /tmp/tmp2$$`" ]
                then
                        echo $CASENO
                fi
                CASENO=`expr $CASENO + 1`
                /usr/bin/rm /tmp/tmp1$$ /tmp/tmp2$$
        fi
done

调用格式为: tester program_name input_file output_file

论坛徽章:
0
6 [报告]
发表于 2003-08-03 13:00 |只看该作者

跳出循环,变量值消失. SOS

单看你的程式很难了解你的意图,而且你也说你的程式并不工作。

举个例子说明比较好一点儿,比如说input_file和output_file以及第一个可执行程式是一个什么样的程式。最后这个脚本的输出是什么样子的。这样才好让大伙帮你啊。

论坛徽章:
0
7 [报告]
发表于 2003-08-03 13:09 |只看该作者

跳出循环,变量值消失. SOS

TOTALLINE=`wc -l $3 | sed "s/ $3$//" | sed "s/^ //"`
这个是取第三个文件的行数吗?如果是用
TOTALLINE=`cat $3|wc -l`就可以了,还有就是为什么把它设成readonly之后以下的程式并没有使用这个变量?

论坛徽章:
0
8 [报告]
发表于 2003-08-03 13:14 |只看该作者

跳出循环,变量值消失. SOS

input file:
H FOO + =
H FOO + ==
FOO + H ==
FOO + H =
FOO  H + =
H H + H FOO =
文件名为inputs.txt.
还有一个outputs file:
=========
Error: Invalid ERN in expression  H FOO +
RC=1
=========
Error: Invalid ERN in expression  H FOO +
RC=1
=========
Error: Invalid ERN in expression  FOO +
RC=1
=========
Error: Invalid ERN in expression  FOO +
RC=1
=========
Error: Invalid ERN in expression  FOO H +
RC=1
这2个文件和另一个UNIX 文件都是老师给的. 要我们写一个shell 文件把input的test case 给ernexp程序, 这程序会打印出结果. 然后和outputs.txt 进行比较如果某个case 不一样就打印出 case number. outputs 中的"========" 是用来分割test case 的. 下一行是结果. 在下一行是这个程序的 return value.
执行格式: tester.sh ernxep inputs.txt outputs.txt
若还是不clear. 我再补充. Thanks so much.

ernexp.jpg

14.54 KB, 下载次数: 3971

UNIX 可执行文件. 把.jpg去掉既可.

论坛徽章:
0
9 [报告]
发表于 2003-08-03 13:54 |只看该作者

跳出循环,变量值消失. SOS

你就是要把file1中的每一行传给ernexp这个程式,这个程式会得出一个结果,再把这个结果同file2中对应的行进行比较。不同的话打印行号是吗?
也就是说file1和file2是两个相同的文件?

论坛徽章:
0
10 [报告]
发表于 2003-08-03 14:19 |只看该作者

跳出循环,变量值消失. SOS

你的程式在我的系统上不工作!!返回值是数值还是字串?
如果是象我上面说的那样?给你一个流程,余下的你自己来吧


  1. #!/bin/sh

  2. PROC="$1"
  3. LNCOUNT=`cat $2|wc -l`
  4. curln=1

  5. while [ curln -le $LNCOUNT ];do
  6.         ln=`sed -n "${curln}p" $3`
  7.         ret="sed -n "${curln}p $2 | $PROC`"
  8.         if [ ! "X${ln}" = "X${ret}" ];then #如果结果不相同
  9.                 echo "[ ${curln} ] error: ${ret} ${ln}" #输出
  10.         fi
  11.         curln=$(($curln + 1)) #取下一行
  12. done
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP