고정시키다

고정시키다

ksh 스크립트에서 무한 루프를 생성하지 않고 sqlcmdwith 옵션을 사용할 수 있는 방법이 있습니까 ?-i input_file

  • 코드는 한 줄씩 읽고 $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.
  • 레드햇 엔터프라이즈 리눅스 6.7(KornShell).

답변1

@meuh가 댓글에서 언급했듯이 sqlcmd,표준 입력그래서 추가는 </dev/null이 문제를 해결합니다. 문제는 루프가 while반복 된다는 것입니다.표준 입력(file에서 리디렉션하기 전 exec 0<"${file}") 및 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!"

관련 정보