我在bash脚本中有以下代码段:
db2 connect to $DB
var=$(db2 -x "$query" | tr -d " ")
$query
包含select count
个查询,-x
只打印出没有标题的命令结果,因此var
将被分配给一个数字。
如果$(...)
在子shell中执行,并且不继承与DB2的连接,则会发生“SQL1024N A database connection does not exist. SQLSTATE=08003
”消息。
我不知道db2 connect
命令如何影响环境。
答案 0 :(得分:4)
一个提示:将DB2DBDFT环境变量设置为您要使用的数据库的名称:它将使DB2 CLP能够建立隐式连接(如果您在数据库服务器上运行)。
$ export DB2DBDFT=sample
$ db2 "select count(*) from empphoto" # <-- no "db2 connect to sample" needed.
这也有助于使子壳工作。
#!/bin/ksh
export DB2DBDFT=sample
count=$(db2 -x "select count(*) from empphoto" | awk '{print $1}')
print "Count is ${count}"
祝你好运!
答案 1 :(得分:2)
如果您可以在子shell中执行所有变量处理,则可以执行以下操作:
db2 connect to $DB
db2 -x "$query" | tr -d " " | {
read var
do-stuff with var
}
但是,您必须使用临时文件或命名管道将变量值返回给父级。
答案 2 :(得分:0)
这里不知道具体细节:第一个命令'db2 connect to $ DB'可能已完成,并建立了连接。一旦完成,它也会关闭它。
听起来你想要一个像这样的结构:
var=$(db2 -x "connect to $DB;$query" | tr -d " ")
IOW:运行db2命令并让他首先执行'connect to $ DB'(shell将为你替换$ DB)然后'$ query'(shell再次进行替换。)
我不确定db2需要哪个分隔符,所以';'是一个猜测。