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⟩.