Variables 通过bash脚本将DB2输出到变量
我希望有人能帮助将db2命令的输出应用于变量,以便稍后在脚本中使用 到目前为止我在Variables 通过bash脚本将DB2输出到变量,variables,while-loop,db2,subshell,Variables,While Loop,Db2,Subshell,我希望有人能帮助将db2命令的输出应用于变量,以便稍后在脚本中使用 到目前为止我在 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 TABN
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'")
当尝试在while循环外部引用$Counter时,如果数据库连接不存在,它将返回SQL1024N。SQLSTATE=08003作为echo$howmount
我尝试了使用管道的另一种方法,它使$HowMany显示正确的值,但由于它是一个子shell,因此之后它就丢失了
如果可能的话,我不想使用临时文件并删除它们,因为我不喜欢脚本随时中止时留下的文件。正如您所发现的,一个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
Linux和UNIX上的DB2CLP可以在不丢失其数据库连接上下文的情况下进行处理,从而可以将查询结果捕获到本地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
谢谢你,伊恩。上面的解决方案是我尝试过的一个选项,但在循环外部引用时,该变量返回空值。我开始想,我可能需要使用文件来实现这一点,我想避免你说$Counter的值在你离开do循环后没有设置?或者$HowMany?$计数器返回一个空值,这两个都是在循环之后执行的,您必须使用bash。要确保循环中使用的变量仅在该循环的范围内,需要更加小心。如果您执行我建议的ksh脚本,它将工作。或者,@fredsobotka的解决方案将在您的查询只返回1列时起作用。