2015-02-05 3 views
0

누군가가 db2 명령의 출력을 나중에 스크립트에 사용할 변수에 적용하는 데 도움이되기를 바랍니다. 내가 파이프를 사용하여 다른 방법을 시도한 echo $HowManyDB2 출력을 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'") 

while 루프의 $Counter 외부 참조하려고, 그것은 SQL1024N A database connection does not exist. SQLSTATE=08003을 반환 $HowMany은 올바른 값을 표시하지만 서브 쉘이므로 나중에 손실됩니다.

임시 파일을 사용하지 않고 가능한 경우 제거하십시오. 스크립트가 언제든지 중단되면 파일을 남기지 않는 것이 좋습니다.

답변

2

로를 쿼리 결과를 로컬 셸 변수에 캡처하거나 인라인 된 텍스트 블록으로 처리합니다.

#!/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

하나의 쉘에서 DB2 연결을 하위 쉘에서 사용할 수 없습니다. 하위 셸을 사용할 수도 있지만 해당 하위 셸에 CONNECT 문을 넣어야합니다.

은 그래서 간단한 재 작성의 더, 그리고 서브 쉘 사용하지 마십시오

Linux와 UNIX에서 DB2 CLP가 가능하게, 데이터베이스 연결 컨텍스트를 잃지 않고 command substitution을 처리 할 수 ​​
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

감사합니다. Ian. 위의 솔루션은 내가 시도한 옵션이지만 루프 외부에서 참조 될 때 변수는 null 값을 반환합니다. 나는 이것을 피하기 위해 파일을 사용해야한다고 생각하기 시작했다. –

+0

do 루프를 빠져 나간 후에'$ Counter '의 값이 설정되지 않는다고 말하는가? 또는'HowMany'? –

+0

$ 카운터는 null 값을 반환합니다. 음, 모두 루프 뒤에서 수행합니다. –

관련 문제