Variables 通过bash脚本将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命令的输出应用于变量,以便稍后在脚本中使用

到目前为止我在

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列时起作用。