如何在用于截断表的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
终止符。所以只有一个代码>应修复此问题。您是否尝试附加分号?