2016-11-28 60 views
1

我在寫一個截斷表的腳本。問題在於腳本無限循環。如何在用於截斷表的shell腳本中打破循環?

./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去\ n EOF' ' – Pravin

+0

@Pravin,「_sqlcmd等待輸入,並進入無限_」 - 這就是我的意思。但是,我想,追加';'或';去;'應該足夠了。但是,文檔建議不要在查詢中使用'go'終止符。所以一個';'應該解決這個問題。你有沒有試圖追加一個分號? –