免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-10 23:23 |只看该作者 |倒序浏览
公司用aix,可以使用管道传值给read读入一个变量,类似 echo "hello" | read var; echo $var #得到hello
但家里的bash用不了,应该怎么在bash下实现呢?

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
2 [报告]
发表于 2009-02-10 23:25 |只看该作者
家里报什么错....

论坛徽章:
0
3 [报告]
发表于 2009-02-10 23:25 |只看该作者
try
echo "hello" | (read var; echo $var)

大括号也行
echo "hello" | { read var; echo $var }

[ 本帖最后由 haimming 于 2009-2-10 23:38 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-02-10 23:37 |只看该作者
把报错贴出来吧!!!大家帮你看!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2009-02-10 23:51 |只看该作者
aix用的是ksh, 或许可以那样, 而在bash下这样那样是不可以的, 在bash下这样试一试
#bash
read var < <(echo hello)

ftp://ftp.cwru.edu/pub/bash/FAQ

[ 本帖最后由 寂寞烈火 于 2009-2-10 23:52 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-02-11 00:25 |只看该作者
呃 这个好像要扯到标准的问题

记得一篇讲while循环遇上重定向时的陷阱的文章里面有讲

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2009-02-11 06:28 |只看该作者
echo "hello" | (read var; echo $var)
是通用的写法。

看来bash下的read是subshell方式的。

论坛徽章:
0
8 [报告]
发表于 2009-02-11 21:33 |只看该作者
在bash下就输出一个空行
$echo "hello" | read var;
$echo $var;

$

就如beginner-bj 所说的在 bash下应该是subshell的方式
echo "hello" | (read var; echo $var)
是完美运行的,不过这里给的var也是subshell中的变量,外面还是无法调用

一般我们在aix下操作db2很多用到
db2 "select count(*),'num' from tablename" | grep -i num | read count other;
然后就直接可以使用$count来做一些操作了,现在在bash下代码就不通用了

假如用下面语句
db2 "select count(*), 'num' from test" | grep -i num | (read var other; echo $var); #输出8
这个8 如何赋值给一个变量呢?

-------------------

寂寞烈火 的方法可以实现值输出到变量
$read a b< <(echo "hello world");
$echo $a;  
hello
$echo $b;
world

$read var other < <(echo "hello world"| grep -i world)
$echo $var;
hello
$echo $other;
world


$db2 "select count(*),'num' from test" | grep -i num;
      8    num
$read count other < <(db2 "select count(*),'num' from test" | grep -i num)
$echo $count

$echo $other

$

都是输出空行,这个是为什么呢。。。还有烈火的这种用法好像很少看到,能具体解释下么,谢谢哈~~~

[ 本帖最后由 kenshinsee 于 2009-2-11 21:47 编辑 ]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
9 [报告]
发表于 2009-02-11 21:48 |只看该作者

回复 #8 kenshinsee 的帖子

var=$(db2 "select count(*), 'num' from test" | awk '/num/{print $1}')
echo $var

论坛徽章:
0
10 [报告]
发表于 2009-02-11 22:13 |只看该作者

回复 #8 kenshinsee 的帖子

我觉得并非是read是subshell的方式,而应该说是管道在bash里是subshell的方式,好像ksh里面管道不是subshell方式(找个时间验证下)

subshell的参数不能返回给shell,
如果是简单的,可用tim的方法
如果复杂的,可用文件返回
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP