如何在用于截断表的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
文件的内容不太可能导致此类行为,除非该文件非常大。循环结构是正确的,迭代次数应该与文件中的行数相匹配。
感谢您的编辑和回答...问题与sqlcmd ... sqlcmd等待输入,同时进入无限期看..解决问题通过传递EOF到sqlcmd作为'sqlcmd -U $ DSTN_USER -P $ DSTN_PASSWORD -D -S $ DSTN_SERVER Pravin
@Pravin,“_sqlcmd等待输入,并进入无限_” - 这就是我的意思。但是,我想,追加';'或';去;'应该足够了。但是,文档建议不要在查询中使用'go'终止符。所以一个';'应该解决这个问题。你有没有试图追加一个分号? –