我正在写一个截断表格的脚本。问题是脚本无限循环。
./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
文件只包含一个表名。
答案 0 :(得分:1)
您不需要将查询写入临时文件。请改用-q
或-Q
选项:
q="truncate table ${TABLE};"
sqlcmd -m 1 -U "$DSTN_USER" -P "$DSTN_PASSWORD" -S "$DSTN_SERVER" -q "$q"
请注意查询末尾的;
。可能,这就是剧本&#34;停止&#34;的原因。这可能看起来像一个无限循环。
另请注意使用双引号。您应该用双引号括起变量,以防止重新解释特殊字符。
顺便说一句,您可以通过在脚本开头添加set -x
来找到导致问题的确切命令。 set -x
打开调试模式。启用调试模式后,您将看到正在执行的命令。
$TABLE_LIST
文件的内容导致此类行为的可能性非常小,除非文件非常大。循环结构是正确的,迭代次数应该与文件中的行数匹配。