我开始编写我的第一个大型bash脚本,我试图解决一个问题。
我有一个文件:packagesList.txt
,其中包含我需要通过sqlplus运行的oracle包的名称。该文件如下所示:
ORACLETASK1
ORACLETASK2
等
文件夹配置包含以包命名的文件。他们的名字就是这样的:ORACLETASK1-test.txt
,ORACLETASK2-test.txt
,他们的内容看起来完全像这样:
ORACLETASK1FUNCTION1(PARAMETER1, PARAMETER2)
ORACLETASK1FUNCTION1(PARAMETER3, PARAMETER4)
ORACLETASK2
:
ORACLETASK2FUNCTION1(PARAMETER1, PARAMETER2)
ORACLETASK2FUNCTION1(PARAMETER3, PARAMETER4)
现在 - 我需要做的是生成一个文件(在循环中)ORACLETASK1-run.conf
,如下所示:
ORACLETASK1.ORACLETASK1FUNCTION1(PARAMETER1, PARAMETER2)
ORACLETASK1.ORACLETASK1FUNCTION1(PARAMETER3, PARAMETER4)
ORACLETASK2.ORACLETASK2FUNCTION1(PARAMETER1, PARAMETER2)
ORACLETASK2.ORACLETASK2FUNCTION1(PARAMETER3, PARAMETER4)
Finallz,我需要为ORACLETASK1-run.conf
文件中的每一行生成(循环中)一系列sql文件,如下所示:
QUESTION UNRELATED SET AND CLEAR COMMANDS GO HERE
VARIABLE RC REFCURSOR;
并且最重要的一条线就在这里
EXEC :RC := ORACLETASK1.ORACLETASK1FUNCTION1(PARAMETER1, PARAMETER2);
文件的其余部分
SPOOL SOME_FILE_NAME_I_DONT_KNOW_HOW_TO_NAME_IT_YET.TXT
PRINT RC;
SPOOL OFF
EXIT;
也许这个问题有点笼统,但我正在寻找任何可能导致我让这个脚本工作的线索...
答案 0 :(得分:0)
这会让你朝着正确的方向前进:
CONFIGDIR="/path/to/config/files"
while read -r line ; do
while read -r config ; do
echo "$line.$config" >> "ORACLETASK1-run.conf"
done < "$CONFIGDIR/$line-test.txt"
done < packagesList.txt
while read -r line ; do
sqlfile=$(echo $line | sed -r 's/(.*\..*)\((.*), *(.*)\)/\1.\2.\3/'
cat << _EOCFG_ >> "$sqlfile.sql"
VARIABLE RC REFCURSOR;
EXEC :RC := $line;
SPOOL SOME_FILE_NAME_I_DONT_KNOW_HOW_TO_NAME_IT_YET.TXT
PRINT RC;
SPOOL OFF
EXIT;
_EOCFG_
done < ORACLETASK1-run.conf
答案 1 :(得分:0)
因此,您需要阅读脚本所在的文件和名为Configuration的子文件夹。
您需要执行类似
的操作for i in *.txt Configuration/*.txt; do
[ -e "$i" ] || continue
filename=$(echo "$i" | cut -d- -f1)
while IFS= read -r aline; do
#do something
done < $i
done
cut命令是一个如何获取文件的第一部分的示例,例如&#34; ORACLETASK1-test.txt&#34;,结果将是&#34; ORACLETASK1&#34;因为参数&#34; -d - &#34; 。
您可以处理评论所在的每个文件的每一行。那就是你把逻辑放在哪里。
如果它对您来说更简单,您可以分为两部分。一个while循环读取包列表文件和for循环而没有第一个* .txt来读取子文件夹中的文件。