kshスクリプトで無限ループを作成せずにsqlcmd
を-i input_file
オプションとともに使用する方法はありますか?
$file
から行を読み取り、それを1行ずつ解析して、データを抽出し、他のものを処理します。stdin
から$file
を読み取ります」。無限ループコード:
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!
この問題の回避策がある場合でも、その動作の理由と、-i input_file
オプションを禁止せずにsqlcmd
ツールを使用する方法を知りたいと思います。
注:
@meuhがコメントで述べたように、sqlcmd
はstdinを読んでいたので、</dev/null
を追加すると問題が修正されました。問題は、while
ループがstdin(以前はファイルexec 0<"${file}"
からリダイレクトされた)とsqlcmd
内にあるwhile
を反復処理していたことでした。 stdinから読み取ろうとしました。解決策は、stdinではなく/dev/null
からsqlcmd
を読み取るようにすることでした。
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!"