2015-02-05 77 views
0

我希望有人可以帮助将db2命令的输出应用于一个变量,以便稍后在脚本中使用。DB2通过bash脚本输出到变量

到目前为止,我在...

db2 "connect to <database> user <username> using <password>" 

while read HowMany ; 
do 
    Counter=$HowMany 
    echo $HowMany 
done < <(db2 -x "SELECT COUNT(1) FROM SYSCAT.COLUMNS WHERE TABNAME = 'TableA' AND TABSCHEMA='SchemaA' AND GENERATED = 'A'") 

当试图引用$Counter外while循环,它返回SQL1024N A database connection does not exist. SQLSTATE=08003一样的echo $HowMany

我试着用管的另一种方法,这使得$HowMany显示正确的值,但是因为这是一个子外壳,所以它随后会丢失。

我宁可不使用临时文件,如果可能的话删除它们,因为如果脚本随时中止,我不喜欢留下文件。

回答

2

在Linux和UNIX的DB2 CLP可以处理command substitution不失其数据库连接上下文,从而能够将查询结果捕获到本地shell变量或将其视为内联块文本。

#!/bin/sh 
# This script assumes the db2profile script has already been sourced 

db2 "connect to <database> user <username> using <password>" 

# Backtick command substitution is permitted 
HowMany=`db2 -x "SELECT COUNT(1) FROM SYSCAT.COLUMNS WHERE TABNAME = 'TableA' AND TABSCHEMA='SchemaA' AND GENERATED = 'A'"` 

# This command substitution syntax will also work 
Copy2=$(db2 -x "SELECT COUNT(1) FROM SYSCAT.COLUMNS WHERE TABNAME = 'TableA' AND TABSCHEMA='SchemaA' AND GENERATED = 'A'") 

# One way to get rid of leading spaces 
Counter=`echo $HowMany` 

# A while loop that is fed by process substitution cannot use 
# the current DB2 connection context, but combining a here 
# document with command substitution will work 
while read HowMany ; 
do 
    Counter=$HowMany 
    echo $HowMany 
done <<EOT 
$(db2 -x "SELECT COUNT(1) FROM SYSCAT.COLUMNS WHERE TABNAME = 'TableA' AND TABSCHEMA='SchemaA' AND GENERATED = 'A'") 
EOT 
0

正如您发现的,一个shell中的DB2连接不可用于子shell。你可以使用一个子shell,但你必须将CONNECT语句放在该子shell中。

所以它更像是一个简单的重写的,并且不使用一个子shell:

db2 "connect to <database> user <username> using <password>" 

db2 -x "SELECT COUNT(1) FROM SYSCAT.COLUMNS WHERE TABNAME = 'TableA' AND TABSCHEMA='SchemaA' AND GENERATED = 'A'" | while read HowMany ; do 
    Counter=$HowMany 
    echo $HowMany 
done 
+0

谢谢伊恩。上面的解决方案是我尝试过的一个选项,但在循环外引用的变量会返回空值。我开始认为我可能需要使用这个我很乐意避免的文件 – 2015-02-05 19:03:20

+0

您是否在离开do循环后未设置'$ Counter'的值?或'$ HowMany'? – 2015-02-05 19:42:45

+0

$ Counter返回一个空值,好吧,都在循环后执行 – 2015-02-05 22:15:14