免费注册 查看新帖 |

Chinaunix

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

shell为什么没有顺序执行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-07 02:26 |只看该作者 |倒序浏览
现有num.txt文件如下:
Num:123
Title:第一章
Content:123

Num:124
Title:第二章
Content:124

Num:125
Title:第三章
Content:126


我写了一个shell脚本:
#!/bin/bash
cat num.txt|while read line2
do
        [ -n $(echo $line2|grep 'Num:') ] && src=$(echo $line2|grep -Po '(?<=Num.*') && echo $src
        [ -n $(echo $line2|grep 'Title:') ] && dest=$(echo $line2|grep -Po '(?<=Title.*') && echo $dest
        echo "OK"
done


运行后结果如下:
123
OK
第一章
OK
OK
OK
124
OK
第二章
OK
OK
OK
125
OK
第三章
OK
OK

这个结果与我期望的不一样
我期望的结果应该是
123
第一章
OK
124
第二章
OK
125
第三章
OK

不知道为什么多了好多OK
而且输出的顺序也不对
我明明是先输出$src后输出$dest再输出OK的
为什么中间多出了许多OK呢
请大家寄予解答
谢谢

论坛徽章:
0
2 [报告]
发表于 2009-10-07 07:13 |只看该作者
echo "OK"

论坛徽章:
0
3 [报告]
发表于 2009-10-07 08:19 |只看该作者
echo "OK" 找出来了

论坛徽章:
0
4 [报告]
发表于 2009-10-07 08:36 |只看该作者
你没发觉 你逻辑不通么 你这样的话 读一行 第一个判断 第二个判断 echo 一个ok
所以才会这样 就是说 你这么些 没读一行就echo 一个 ok....空行也 echo 一个ok 就是你这个错误的结果了

如果你要你那种结果 就把content直接改成ok 就可以了

论坛徽章:
0
5 [报告]
发表于 2009-10-07 09:29 |只看该作者
晕。每读到一行都echo "OK"还问为什么
msingle 该用户已被删除
6 [报告]
发表于 2009-10-07 09:44 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2009-10-07 11:43 |只看该作者
我明白了  谢谢大家  是我逻辑上出错了

论坛徽章:
0
8 [报告]
发表于 2009-10-07 11:47 |只看该作者
原帖由 cxfcxf 于 2009-10-7 08:36 发表
你没发觉 你逻辑不通么 你这样的话 读一行 第一个判断 第二个判断 echo 一个ok
所以才会这样 就是说 你这么些 没读一行就echo 一个 ok....空行也 echo 一个ok 就是你这个错误的结果了

如果你要你那种结果 就 ...

不好有意思
把content直接写出来是什么意思
不太明白,是把echo "OK"加入到 [ -n $(echo $line2|grep 'Title:') ] && dest=$(echo $line2|grep -Po '(?<=Title.*') && echo $dest 之后么?
我的本意是把echo "OK"换成 mv $src.txt $dest.txt
完成批量转换文件名
请问该如何做?

[ 本帖最后由 iceriver68 于 2009-10-7 12:01 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-10-07 13:01 |只看该作者
我意思是 每次匹配到content的时候 做这个ok
就是 在最后再加一句类似你的
[ -n $(echo $line2|grep 'content:') ] && mv $src.txt $dest.txt

第一次读
读第一行 遇到num 存到$src
然后读第二行 遇到title 存到$dest
然后碰到第一个content的时候 用这个mv 不久可以了嘛

这样只要读的顺序是num->title->content 那么每次都可以照你的方法把它取出来存进去 之前的2个函数做掉 就是mv以后已经没用了 那么取第二个num的时候直接覆盖掉之前的num就可以了
这样很取巧 只是适用于你这个顺序


比较好的做法是 遇到num awk后面的 存在一个数组 比如num[]
遇到title awk后面的 存到另一个数组 比如 title[]
然后做一个for 看看数组里面一个多少元素
mv num[1] title[1]

论坛徽章:
0
10 [报告]
发表于 2009-10-07 13:17 |只看该作者
加上了那条  [ -n $(echo $line2|grep 'Content:') ] &&  echo "mv $src.txt $dest.txt"
结果跟预想的也不一样
理论上应该是第一行取num 第二行取title 第三行输出mv语句
实际上运行的结果是这样的:

123
mv 123.txt .txt
第一章
mv .txt 第一章.txt
mv .txt .txt
mv .txt .txt
mv .txt .txt
124
mv 124.txt .txt
第二章
mv .txt 第二章.txt
mv .txt .txt
mv .txt .txt
mv .txt .txt
125
mv 125.txt .txt
第三章
mv .txt 第三章.txt
mv .txt .txt


看起来是无论找没找到content都运行 输出mv了

但是我把语句改成 [ -n $(echo $line2|grep 'Content:') ] &&  con=$(grep -Po (?<=Content.*) && echo $con
顺序就没有错
就是输出
123
第一章
123
124
第二章
124
125
第三章
125

为什么??

[ 本帖最后由 iceriver68 于 2009-10-7 13:39 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP