2016-11-28 8 views
1

테이블을 잘라내는 스크립트를 작성하고 있습니다. 문제는 스크립트가 무한 루프로 진행된다는 것입니다.테이블을 잘라내는 데 사용되는 셸 스크립트에서 루프를 나누는 방법은 무엇입니까?

./n_input에는 스크립트에 사용되는 환경 변수가 포함되어 있습니다.

#!/bin/ksh 

INPUT_FILE=./n_input 
if [ ! -e $INPUT_FILE ]; 
then 
     echo "Error: Input file require" 
     exit 1 
fi 

source $INPUT_FILE 

while read Table 
do 
     TABLE="$DSTN_DATABASE.dbo.$Table" 

     echo "Table : $TABLE" 

     QUERY="truncate table $TABLE" 
     echo $QUERY > ./tmp_file 
     sqlcmd -m 1 -U $DSTN_USER -P $DSTN_PASSWORD -D -S $DSTN_SERVER -m1 -i ./tmp_file 

     RET_VALUE=$? 
     if [ $RET_VALUE -ne 0 ] 
     then 
      echo "Error $TABLE" 
     fi 
done < $TABLE_LIST 
exit 0 

루프를 어떻게 끊을 수 있습니까? 스크립트에서 sqlcmd을 제거하고 작동하는지 확인하려고했습니다. 예상대로 작동합니다. sqlcmd -Q 옵션과 동일한 동작을 관찰했습니다.

$TABLE_LIST 파일에는 하나의 테이블 이름 만 있습니다.

답변

1

임시 파일에 쿼리를 쓸 필요가 없습니다. -q 사용하거나 대신 -Q 옵션 :

q="truncate table ${TABLE};" 
sqlcmd -m 1 -U "$DSTN_USER" -P "$DSTN_PASSWORD" -S "$DSTN_SERVER" -q "$q" 

주 쿼리의 끝에 ;. 아마도 그게 스크립트가 "멈추는"이유 일 것입니다. 그것은 무한 루프처럼 보일 것입니다.

큰 따옴표 사용에 유의하십시오. 특수 문자의 재 해석을 방지하려면 변수를 큰 따옴표로 묶어야합니다.

그런데 스크립트 시작 부분에 set -x을 추가하여 문제를 일으키는 정확한 명령을 찾을 수 있습니다. set -x은 디버깅 모드를 켭니다. 디버깅 모드를 켜면 실행중인 명령이 표시됩니다.

파일이 매우 큰 경우가 아니면 $TABLE_LIST 파일의 내용이 이러한 동작을 일으키는 것은 거의 없습니다. 루프 구조가 정확하며 반복 횟수는 파일의 줄 수와 일치해야합니다.

+0

편집과 대답을 주셔서 감사합니다 ... 문제는 sqlcmd ... sqlcmd는 입력을 기다리고 무한하게 보입니다 .. EOF를 sqlcmd에 전달하여 해결 된 문제는 sqlcmd -U $ DSTN_USER -P $ DSTN_PASSWORD -D입니다. -S $ DSTN_SERVER <<-EOF \ n $ QUERY \ n go \ n EOF' ' – Pravin

+0

@Pravin, "_sqlcmd는 입력을 기다리고 while은 무한 _에 들어갑니다."- 그것이 내가 의미 한 것입니다. 그러나 쿼리에';'또는'; go;'를 추가하는 것으로 충분할 것으로 생각됩니다. 그러나, 문서에서는 쿼리에'go' 터미네이터를 사용하지 않는 것이 좋습니다. 따라서 하나의';'가 문제를 해결해야합니다. 세미콜론을 추가하려고 시도 했습니까? –