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

时间:2016-11-28 11:19:47

标签: shell ksh sqlcmd

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

./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文件只包含一个表名。

1 个答案:

答案 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文件的内容导致此类行为的可能性非常小,除非文件非常大。循环结构是正确的,迭代次数应该与文件中的行数匹配。