免费注册 查看新帖 |

Chinaunix

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

高手急救!!关于反引号与变量赋值,非常奇怪 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-13 09:26 |只看该作者 |倒序浏览
$ db2 "select count(*) from spe.reexecutepoint"

1         
-----------
          0

  1 record(s) selected.

$ db2 "select count(*) from spe.reexecutepoint" | sed -n '4s/[[]]//gp' | read a
$ echo $a
0
$ unset a
$ a=`db2 "select count(*) from spe.reexecutepoint" | sed -n '4s/[[]]//gp'`
$ echo $a

$

上面是我在AIX上的执行结果的抓屏,红色部分的代码为什么没有把变量a赋值,而蓝色部分的代码确可以给a赋值

论坛徽章:
0
2 [报告]
发表于 2004-10-13 10:44 |只看该作者

高手急救!!关于反引号与变量赋值,非常奇怪

先试一下
echo sss | read varrr
echo $varrr

echo sss | { read varrr; echo $varrr }

可以发现,第一种写法中$varrr是echo不出来的,
所以read varrr必定是在一个子shell中执行,
varrr的值不会传到命令行自身的shell中来。

可以想见,
楼主的代码中,第一个echo $a中a的值,
并非是由read a所赋,a的值必定早已有之,且为0。

第二个a,应该是有的,被sed一搞什么都不输出。

论坛徽章:
0
3 [报告]
发表于 2004-10-13 13:43 |只看该作者

高手急救!!关于反引号与变量赋值,非常奇怪

不是的,在执行这些之前我执行unset a了,问题好像没那么简单

论坛徽章:
0
4 [报告]
发表于 2004-10-13 14:14 |只看该作者

高手急救!!关于反引号与变量赋值,非常奇怪

我向spe.reexecutepoint插入三条记录(原先是空表)后,执行下面的语句,下面是抓屏
$ db2 "select count(*) from spe.reexecutepoint" | sed -n '4s/[[]]//gp'
3
$

这条命令的结果是正确的,为什么把上面的命令加上反引号`后,不能把结果赋给一个变量呢?郁闷

论坛徽章:
0
5 [报告]
发表于 2004-10-15 10:21 |只看该作者

高手急救!!关于反引号与变量赋值,非常奇怪

在www.loveunix.net上网名为larryh 的网友的回帖

你的shell有问题?
AIX korn shell:

[H50:root:/] cat yy

1
-----------
0

1 record(s) selected.

[H50:root:/] cat yy | sed -n '4s///gp'
0
[H50:root:/] unset a; cat yy | sed -n '4s///gp'| read a
[H50:root:/] echo $a
0
[H50:root:/] unset a; a=`cat yy | sed -n '4s///gp'`
[H50:root:/] echo $a
0
[H50:root:/]

论坛徽章:
0
6 [报告]
发表于 2004-10-15 10:25 |只看该作者

高手急救!!关于反引号与变量赋值,非常奇怪

在www.loveunix.net上网名为thrips 的网友的回帖

不在单位里,没法试。
不过可能你的进程没绑定。因为用反引号是要开个子进程的,子进程没做db2 connect 的话会出现这种情况。请先试一下
a=`db2 "select count(*) from spe.reexecutepoint" `
echo $a

论坛徽章:
0
7 [报告]
发表于 2004-10-15 10:26 |只看该作者

高手急救!!关于反引号与变量赋值,非常奇怪

在www.loveunix.net上我的回帖

larryh,你的例子我试了,结果正如你所说的,但我的例子的结果还是那样,在我执行DB2的SELECT语句前我已经CONNECT了

论坛徽章:
0
8 [报告]
发表于 2004-10-15 10:29 |只看该作者

高手急救!!关于反引号与变量赋值,非常奇怪

在www.loveunix.net上我的回帖

thrips真是老大,我按照你的意思写了,下面是我的抓屏
$ a=`db2 connect to dl>/dev/null;db2 "select count(*) from spe.reexecutepoint" | sed -n '4s/[[]]//gp'`
$ echo $a
2
$

能解释一下为什么吗?为什么我执行完db2 connect to dl(我的数据库名)再执行
a=`db2 "select count(*) from spe.reexecutepoint" | sed -n '4s/[[]]//gp'`不好使呢

论坛徽章:
0
9 [报告]
发表于 2004-10-15 10:30 |只看该作者

高手急救!!关于反引号与变量赋值,非常奇怪

在www.loveunix.net上我的回帖

补充一下,我在执行上面的语句前我先向spe.reexecutepoint表中插入了两条记录

论坛徽章:
0
10 [报告]
发表于 2004-10-15 10:31 |只看该作者

高手急救!!关于反引号与变量赋值,非常奇怪

在www.loveunix.net上网名为thrips 的网友的回帖

你把sed去掉就清楚了,你sed的是db2的出错信息。
反引号和脚本是一样的,都要另开一个sh进程来执行。你当前进程connect了,可是你的新sh进程并没有connect。(这个能继承吗?要问一下搞数据库的,可能在哪儿设置一下,我没找到)一般db2的批处理的第一句都是connect吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP