使固定

使固定

有没有办法使用sqlcmdwith-i input_file选项而不在我的 ksh 脚本中创建无限循环?

  • 该代码逐行读取$file并解析它以提取数据并处理其他内容。
  • 它使用文件描述符重定向来“读取$filestdin

无限循环代码:

exec 3<&0
exec 0<"${file}"
while read -r line || [[ -n ${line} ]]
do
    echo "${line}"
    sqlcmd -S svr -U usr -P pwd -i input_file >/dev/null 2>&1
done
exec 0<&3
exec 3<&-
echo "Script completed successfully!"

输出:

line 1 ...
line 1 ...
...
line 1 ...^C

解决方法(使用这里的文档而不是-i input_file选项):

exec 3<&0
exec 0<"${file}"
while read -r line || [[ -n ${line} ]]
do
    echo "${line}"
    sqlcmd -S svr -U usr -P pwd <<-EOF
        -- SOME SQL CODE HERE
    EOF
    # here document lines are indented with tabs, not whitespaces.
done
exec 0<&3
exec 3<&-
echo "Script completed successfully!"

输出:

line 1 ...
line 2 ...
line 3 ...
Script completed successfully!

即使这个问题有解决方法,我也想知道这种行为的原因是什么,以及如何使用该sqlcmd工具而不禁止它的-i input_file选项。

笔记:

  • 适用于 SQL Server 的 Microsoft ODBC 驱动程序 11。
  • 红帽企业 Linux 6.7 (KornShell)。

答案1

正如@meuh 在评论中提到的,sqlcmd正在阅读标准输入因此附加</dev/null解决了这个问题。问题是循环while迭代了标准输入(之前从文件重定向exec 0<"${file}")并且尝试从文件sqlcmdwhile读取标准输入。解决方案是使sqlcmd读取/dev/null而不是标准输入

使固定

exec 3<&0
exec 0<"${file}"
while read -r line || [[ -n ${line} ]]
do
    echo "${line}"
    sqlcmd -S svr -U usr -P pwd -i input_file </dev/null
done
exec 0<&3
exec 3<&-
echo "Script completed successfully!"

相关内容