如何中断用于截断 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
文件的内容不太可能导致此类行为,除非该文件非常大。循环构造正确,迭代次数应与文件中的行数匹配。
我正在编写截断 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
文件的内容不太可能导致此类行为,除非该文件非常大。循环构造正确,迭代次数应与文件中的行数匹配。