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

如何在用于截断表的shell脚本中中断循环?,shell,ksh,sqlcmd,Shell,Ksh,Sqlcmd,我正在写一个截短表的脚本。问题是脚本是无限循环的 /n\u输入包含脚本中使用的环境变量 #!/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"

我正在写一个截短表的脚本。问题是脚本是无限循环的

/n\u输入
包含脚本中使用的环境变量

#!/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
#/bin/ksh
输入文件=。/n\u输入
如果[!-e$INPUT_文件];
然后
echo“错误:需要输入文件”
出口1
fi
源$INPUT\u文件
一边看桌子
做
TABLE=“$DSTN_DATABASE.dbo.$TABLE”
echo“表:$Table”
QUERY=“truncate table$table”
echo$QUERY>/tmp\u文件
sqlcmd-m1-U$DSTN_用户-P$DSTN_密码-D-S$DSTN_服务器-m1-i./tmp_文件
RET_值=$?
如果[$RET_值-ne 0]
然后
echo“错误$TABLE”
fi
完成<$TABLE_列表
出口0
如何打破循环?我已尝试从脚本中删除
sqlcmd
,并验证它是否正常工作。它按预期工作。使用
sqlcmd-Q
选项观察到相同的行为


$TABLE\u LIST
文件只包含一个表名。

您不需要将查询写入临时文件。改用
-q
-q
选项:

q="truncate table ${TABLE};"
sqlcmd -m 1 -U "$DSTN_USER" -P "$DSTN_PASSWORD" -S "$DSTN_SERVER" -q "$q"
注意
在查询的末尾。也许,这就是剧本“停顿”的原因。这可能看起来像一个无限运行的循环

还要注意双引号的使用。您应该将变量用双引号括起来,以防止重新解释特殊字符

顺便说一下,您可以通过在脚本开头添加
set-x
来找到导致问题的确切命令<代码>设置-x
打开调试模式。启用调试模式后,您可以看到正在执行的命令


除非文件非常大,否则
$TABLE\u LIST
文件的内容不太可能导致这种行为。循环构造正确,迭代次数应与文件中的行数匹配。

感谢您的编辑和解答。。。问题是sqlcmd。。。sqlcmd等待输入,同时进入无限查找。。通过将EOF以
sqlcmd-U$DSTN_USER-P$DSTN_PASSWORD-D-S$DSTN_SERVER@Pravin的形式传递给sqlcmd解决了这个问题,“sqlcmd等待输入,然后进入无限状态”-这就是我的意思。但是,我想,附加
,或
;去到查询应该足够了。但是,文档建议不要在查询中使用
go
终止符。所以只有一个
应修复此问题。您是否尝试附加分号?