我在循环中在Bash中构建一个字符串。循环处理的数据来自两个文件中的行,如下所示:
字符串的第一部分是文件1中的一行,如下所示:
SOME_PACKAGE
SECOND PART是文件2的一行,如下所示:
someFunction('some',parameters,here)
最终输出在两个字符串之间有一个点:
1 SOME_PACKAGE.someFunction('some',parameters,here)
1 在这里非常重要。一秒钟解释。
该字符串由双while
循环
while read line1 ; do
while read line2 ; do
stringArray=($line2)
string=$line1.${stringArray[1]}
sqlplus -s /nolog > /dev/null 2>&1 <<EOF
connect user/password@db_instance
variable rc refcursor;
SPOOL ${line1}_${stringArray[0]}.DATA
exec :rc := $string;
print rc;
spool off
exit
EOF
done < file2.txt
done < file1.txt
然后将此字符串传递给SQL Plus,SQL Plus应该退出这样的命令:
SQL> variable rc refcursor;
SQL> exec :rc := SOME_PACKAGE.someFunction('some',parameters,here);
SQL> print rc;
直到现在,一切都运转良好。但是我在someFunction旁边有一个更复杂的参数。现在它看起来像这样:
SOME_PACKAGE.someFunction('some',parameters,here,'and 2 more',NULL)
传递给SQL * Plus的变量似乎在第一个空格结束......所以它看起来像:
SOME_PACKAGE.someFunction('some',parameters,here,'and
据我所知,我不应该在变量中传递空格,或者如果我想这样做,我应该将它们包装在引号中:""
但是我应该在哪里放这些引号以将最终的变量传递给SQL *加上没有那些引号?或者你们提出的其他解决方案是什么?
答案 0 :(得分:2)
由于@ arco444,答案很简单。
所有这一切发生的原因是内部字段分隔符,它被设置为默认值。
我做的是以下内容:
我已经改变了file2
的外观
1 SOME_PACKAGE.someFunction('some',parameters,here,'and 2 more',NULL)
到
1§SOME_PACKAGE.someFunction('some',parameters,here,'and 2 more',NULL)
我在循环之前和之后添加了一些ILS
更改,因此最终代码如下所示:
oldifs=$IFS
IFS="§"
while read line1 ; do
while read line2 ; do
stringArray=($line2)
string=$line1.${stringArray[1]}
sqlplus -s /nolog > /dev/null 2>&1 <<EOF
connect user/password@db_instance
variable rc refcursor;
SPOOL ${line1}_${stringArray[0]}.DATA
exec :rc := $string;
print rc;
spool off
exit
EOF
done < file2.txt
done < file1.txt
IFS=$oldifs
现在一切都像魅力一样。