2015-02-05 76 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