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

How to break loop in shell script used to truncate table?

我正在编写截断 tables 的脚本。问题是脚本进入无限循环。

./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 文件仅包含一个 table 名称。

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

q="truncate table ${TABLE};"
sqlcmd -m 1 -U "$DSTN_USER" -P "$DSTN_PASSWORD" -S "$DSTN_SERVER" -q "$q"

注意查询末尾的 ;。可能,这就是脚本 "stalls" 的原因。这可能看起来像一个无限 运行 循环。

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

顺便说一句,您可以通过在脚本开头添加 set -x 来找到导致问题的确切命令。 set -x 打开调试模式。打开调试模式后,您会看到正在执行的命令。

$TABLE_LIST 文件的内容不太可能导致此类行为,除非该文件非常大。循环构造正确,迭代次数应与文件中的行数匹配。