免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: kenshinsee
打印 上一主题 下一主题

[求助]不同shell下的read晕了 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-02-12 22:37 |只看该作者

回复 #20 kenshinsee 的帖子

那我想问下bash下的read有没有灵活点的用法呢,
难道都read var1 var2,然后靠标准输入来赋值吗?

其实这并不关read的事,究其原因只是参数不能返回给父进程而已,但给其子进程并没问题啊
[code]
[rockfall@localhost tmp]$ cat ../kk.sh
#!/bin/sh
cat $1 |
while read line1 line2
do
    echo $line1
    echo $line2
done
exit 0
[rockfall@localhost tmp]$ cat file2
d      ll
c      kk
2      mm end
[rockfall@localhost tmp]$ ../kk.sh file2
d
ll
c
kk
2
mm end
[rockfall@localhost tmp]$

论坛徽章:
0
22 [报告]
发表于 2009-02-13 21:22 |只看该作者
那就是说管道后的属于subshell,赋值的也是subshell中的变量,所有只有在subshell中输出,在父shell中赋值才行。

[db2inst1@hong Hong]$ var=`(db2 connect to db_1;db2 "select count(*),'yyyyy' from test")| grep -i yyyyy| (read count tmp;echo $count)`
[db2inst1@hong Hong]$ echo $var
8
[db2inst1@hong Hong]$

还有一个问题
如果我dbconnect和select不用括号括起来
[db2inst1@hong Hong]$ var=`db2 connect to db_1;db2 "select count(*),'yyyyy' from test"| grep -i yyyyy`
[db2inst1@hong Hong]$ echo $var
Database Connection Information Database server = DB2/LINUX 9.5.0 SQL authorization ID = DB2INST1 Local database alias = DB_1 8 yyyyy
[db2inst1@hong Hong]$


为什么var不是8   yyyyy 呢?
就是说为什么
db2 connect to db_1;db2 "select count(*),'yyyyy' from test" 通过管道传给subshell的不是select的结果,而是连dbconnect的信息都传过去的呢?

用括号后(db2 connect to db_1;db2 "select count(*),'yyyyy' from test" )传到后面的只是select的结果呢?

论坛徽章:
0
23 [报告]
发表于 2009-02-13 21:38 |只看该作者
db2inst1@hong Hong]$ echo $var
Database Connection Information Database server = DB2/LINUX 9.5.0 SQL authorization ID = DB2INST1 Local database alias = DB_1 8 yyyyy
[db2inst1@hong Hong]$


为什么var不是8   yyyyy 呢?

怎么说是yyyy呢?echo $var不是一行值吗?

论坛徽章:
0
24 [报告]
发表于 2009-02-13 22:58 |只看该作者
我的意思是如果dbconnect和select这两句不用括号括起来
最后赋值给var的是包括dbconnect连接到db2的一些连接信息和select出来的内容

但用了括号,var的值就只有select出来的内容,而括号内第一步的dbconnect打出的内容不会包含进去。。。

如下
[db2inst1@hong Hong]$ var=`echo hello;echo world | grep world`
[db2inst1@hong Hong]$ echo $var
hello world
[db2inst1@hong Hong]$ var=`(echo hello;echo world) | grep world`
[db2inst1@hong Hong]$ echo $var
world
[db2inst1@hong Hong]$
为什么不一样呢?

论坛徽章:
0
25 [报告]
发表于 2009-02-13 23:33 |只看该作者

回复 #24 kenshinsee 的帖子

我觉得这个并不难理解,我们先看这个

  1. [rockfall@localhost ~]$ echo he;echo llo ;echo wor;echo ld|grep world
  2. he
  3. llo
  4. wor
  5. [rockfall@localhost ~]$ (echo he;echo llo ;echo wor;echo ld)|grep world
  6. [rockfall@localhost ~]$ (echo world1;echo hello ;echo world2;echo ld)|grep world
  7. world1
  8. world2
  9. [rockfall@localhost ~]$
复制代码

第一句,几个分号之间是顺序执行的,只有最后一个和grep建立了管道,前面几句都原封不动的执行了打印,返回在标准输出上,如果有赋值语句,自然给了变量;
第二三句,加了刮号,则前面的都会和后面的建立管道关系

论坛徽章:
0
26 [报告]
发表于 2009-02-14 16:09 |只看该作者
汗 是我理解错了
var=`echo hello;echo world | grep world`
这句是先输出了hello,然后再输出world到grep,匹配到后再输出world

谢谢 haimming 的涓涓教导~~~

论坛徽章:
0
27 [报告]
发表于 2009-02-14 16:42 |只看该作者

回复 #26 kenshinsee 的帖子

兄弟严重了,我也是菜鸟,岂敢教导,共同学习罢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP