固定する

固定する

kshスクリプトで無限ループを生成せずにsqlcmdwithオプションを使用する方法はありますか?-i input_file

  • コードは1行ずつ読み取り、$fileそれを解析してデータを抽出し、他の操作を処理します。
  • $file「読み取り」にはファイル記述子リダイレクトを使用しますstdin

無限ループコード:

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。
  • Red Hat Enterprise Linux 6.7(KornShell)。

ベストアンサー1

@meuhがコメントで述べたようにsqlcmd標準入力したがって、追加は</dev/nullこの問題を解決します。問題はループがwhile繰り返されることです。標準入力(ファイルからリダイレクトする前exec 0<"${file}")とファイルsqlcmdからwhile読み込みを試みます。標準入力。解決策は、代わりに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!"

おすすめ記事