SQL 파일에서 한 번에 하나의 쿼리를 추출하는 방법은 무엇입니까?

SQL 파일에서 한 번에 하나의 쿼리를 추출하는 방법은 무엇입니까?

SQL 파일에서 한 번에 하나의 쿼리를 추출하려고 합니다.

내가 시도한 것은 다음과 같습니다.

index1=1
index2=1
while read -n1 char; do
if [[ $char == ";" ]]
  then
     SUBSTRING=$(awk 'substr($index1,$index2)' sql1Temp.sql)
     echo $SUBSTRING 
    index1=$index2
fi 
((index2+=1))

done <sql1Temp.sql

내 SQL 파일은 다음과 같습니다.

SQL 파일.sql

test1에서 *를 선택하십시오.

test2에서 *를 선택하십시오.

테스트 3에서 *를 선택하십시오.

나는 다음과 같은 결과를 얻습니다.

wedtorque@wedtorque-VirtualBox:~/Desktop$ ./masterFile.sh
select *from test1; select *from test2; select *from test3;
select *from test1; select *from test2; select *from test3;
select *from test1; select *from test2; select *from test3;
wedtorque@wedtorque-VirtualBox:~/Desktop$

그리고 내가 기대하는 것은 다음과 같습니다.

wedtorque@wedtorque-VirtualBox:~/Desktop$ ./masterFile.sh
select *from test1;
select *from test1;
select *from test1;
wedtorque@wedtorque-VirtualBox:~/Desktop$

또한 내부 while 루프를 에코하면 $char쿼리에서 파일 이름을 가져올 때마다 인쇄됩니다.$char*select *from test1

이 같은

wedtorque@wedtorque-VirtualBox:~/Desktop$ ./masterFile.sh
s
e
l
e
c
t

masterFile.sh sql1result.sql sql1.sql sql1Temp.sql sql2.sql Untitled Document
f
r
o
m

t
e
s
t
1
select *from test1; select *from test2; select *from test3;
;

답변1

당신이 무엇을 하고 있는지 100% 확신할 수는 없지만 추측해 보겠습니다.

.sql 파일의 테스트 케이스에서는 이름을 다음과 같이 지정했습니다 test.sql.

select * from test1;
select * from test2;
select * from test3;

그리고 SQL 데이터를 읽고 에코하는 스크립트는 다음과 같습니다.

#!/bin/sh

# Get the raw sql data
RAW=`cat test.sql`

# We want to split the raw sql on a line return.
IFS="
"

# Echo out each line? Not sure if this is what you want.
for sql in $RAW
do
    echo "SQL line: [${sql}]"
done

exit

그러면 다음과 같은 결과가 나타납니다.

SQL line: [select * from test1;]
SQL line: [select * from test2;]
SQL line: [select * from test3;]

내 생각에 당신이 놓치고 있는 부분은 바로 그 IFS부분이다. 에서 man sh:

IFS  Input Field Separators. This is normally set to ⟨space⟩, 
     ⟨tab⟩, and ⟨newline⟩.

관련 정보