如何在用于截断表的shell脚本中打破循环?

问题描述:

我在写一个截断表的脚本。问题在于脚本无限循环。如何在用于截断表的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文件只包含一个表名。

您不需要将查询写入临时文件。使用-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 Pravin

+0

@Pravin,“_sqlcmd等待输入,并进入无限_” - 这就是我的意思。但是,我想,追加';'或';去;'应该足够了。但是,文档建议不要在查询中使用'go'终止符。所以一个';'应该解决这个问题。你有没有试图追加一个分号? –