我正在尝试从 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
从测试1中选择*;
从测试2中选择*;
从测试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
时都会打印文件名; ETC$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⟩.