kshスクリプトで無限ループを生成せずにsqlcmd
withオプションを使用する方法はありますか?-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!"