问题描述
我必须编写一个简单的bash脚本,该脚本可以编译多个sql脚本,这些脚本可以使用Oracle SQLPlus convention包含对其他sql脚本的递归引用,因此最终结果将只有一个SQL文件,包含所有(可能也是递归)引用的下标的所有语句。
我用以下bash代码创建了一个名为oracle-script-compressor.sh的简单脚本:
#!/bin/bash
#
#
function err () {
echo $* > "/dev/stderr"
}
function replace_subscripts_placeholders() {
local PROCESSING_FILENAME=$1
echo "-- processing file $PROCESSING_FILENAME"
while read script_line; do
local script_line_NO_LEAD_SPACE="$(echo -e "${script_line}" | sed -e 's/^[[:space:]]*//')"
if [[ $script_line_NO_LEAD_SPACE == \@\@* ]] ; then
local file_name="./${script_line_NO_LEAD_SPACE#\@\@}"
echo "-- found reference to file $file_name"
echo "-- starting with processing,pwd=$PWD"
# for debug purposes:
ls -la
# but this returns always false:
if [ -f "$file_name" ]; then
# so this part is never started:
. replace_subscripts_placeholders $file_name
else
err_msg="WARNING: Could not find the referenced file $file_name"
echo "-- $err_msg"
err $err_msg
fi
else
echo "$script_line"
fi
done < $PROCESSING_FILENAME
}
if test -z "$1" ; then
err "Usage: oracle-script-compressor.sh {file_name_to_process} [> output_file]"
err " Be aware,if the referenced files within {file_name_to_process} are not specified by absolute paths,you have to start the script from corresponding directory."
err " If the part [> output_file] is omitted,then this script writes to standard output"
err " If the part [>> output_file] is used,then the result will be appended to output_file it it exists before the processing"
else
if [ -f "$1" ]; then
replace_subscripts_placeholders $1
else
echo "file $1 does not exist"
fi
fi
我陷入了一个有趣的问题-似乎在函数replace_subscripts_placeholders()内部,文件检查
if [ -f "$file_name" ]; then
. replace_subscripts_placeholders $file_name
else
err_msg="WARNING: Could not find the referenced file $file_name"
echo "-- $err_msg"
err $err_msg
fi
从不进行递归调用,甚至,即使我删除了if语句并使用正确的引用文件名(确实存在)以递归方式真正调用了该函数,也仍然无法识别出该函数,也没有将其传递到循环中递归调用中引用文件的所有行(然后,找不到错误文件,并且无法执行循环)。
我已经将调试消息添加到脚本中,就像上面在脚本中提到的那样,但是仍然找不到,为什么如果文件位于同一目录中,为什么地狱应该bash找不到文件。脚本放置在
user@mycomputer:/tmp/test$ ls -la
celkem 52
drwxr-xr-x 2 user user 4096 zář 14 21:47 .
drwxrwxrwt 38 root root 36864 zář 14 21:48 ..
-rw-r--r-- 1 user user 51 zář 14 21:45 a.sql
-rw-r--r-- 1 user user 51 zář 14 21:45 b.sql
-rw-r--r-- 1 user user 590 zář 14 21:46 start.sql
user@mycomputer:/tmp/test$
,文件start.sql的内容如下:
spool output__UpdSch.log
whenever sqlerror exit sql.sqlcode
--
--
PROMPT a.sql - starting
select to_char(current_timestamp,'YYYY-MM-DD HH24:MI:SS.FF3') as START_TIMESTAMP from dual;
@@a.sql
PROMPT a.sql - finished
select to_char(current_timestamp,'YYYY-MM-DD HH24:MI:SS.FF3') as FINISH_TIMESTAMP from dual;
--
--
PROMPT b.sql - starting
select to_char(current_timestamp,'YYYY-MM-DD HH24:MI:SS.FF3') as START_TIMESTAMP from dual;
@@b.sql
PROMPT b.sql - finished
select to_char(current_timestamp,'YYYY-MM-DD HH24:MI:SS.FF3') as FINISH_TIMESTAMP from dual;
--
--
spool off
如果执行脚本,似乎它可以正确解码文件名,但是bash中仍然存在问题-文件存在的测试始终返回false:
user@mycomputer:/tmp/test$ ~/tmp/oracle-script-compressor.sh start.sql
-- processing file start.sql
spool output__UpdSch.log
whenever sqlerror exit sql.sqlcode
--
--
PROMPT a.sql - starting
select to_char(current_timestamp,'YYYY-MM-DD HH24:MI:SS.FF3') as START_TIMESTAMP from dual;
-- found reference to file ./a.sql
-- starting with processing,pwd=/tmp/test
celkem 52
drwxr-xr-x 2 user user 4096 zář 14 21:47 .
drwxrwxrwt 38 root root 36864 zář 14 21:48 ..
-rw-r--r-- 1 user user 51 zář 14 21:45 a.sql
-rw-r--r-- 1 user user 51 zář 14 21:45 b.sql
-rw-r--r-- 1 user user 590 zář 14 21:46 start.sql
-- WARNING: Could not find the referenced file ./a.sql
WARNING: Could not find the referenced file ./a.sql
PROMPT a.sql - finished
select to_char(current_timestamp,'YYYY-MM-DD HH24:MI:SS.FF3') as START_TIMESTAMP from dual;
-- found reference to file ./b.sql
-- starting with processing,pwd=/tmp/test
celkem 52
drwxr-xr-x 2 user user 4096 zář 14 21:47 .
drwxrwxrwt 38 root root 36864 zář 14 21:48 ..
-rw-r--r-- 1 user user 51 zář 14 21:45 a.sql
-rw-r--r-- 1 user user 51 zář 14 21:45 b.sql
-rw-r--r-- 1 user user 590 zář 14 21:46 start.sql
-- WARNING: Could not find the referenced file ./b.sql
WARNING: Could not find the referenced file ./b.sql
PROMPT b.sql - finished
select to_char(current_timestamp,'YYYY-MM-DD HH24:MI:SS.FF3') as FINISH_TIMESTAMP from dual;
--
--
spool off
user@mycomputer:/tmp/test$
该脚本具有对文件的读取权限,所有文件都位于启动该脚本的同一文件夹中,这也没关系,如果我引用当前目录前缀为“ ./”的文件,是否为没找到。有趣的是,脚本启动期间的检查正确通过了,唯一的问题是在函数内进行搜索...我也尝试过在函数前加上“”。没有它,它就没有任何区别。在引用的文件名中也没有尾随空格。。。如果我将函数内部的变量声明为局部变量,也没有区别。 所以我不知道这可能是问题所在,也许我只是看了太久而看不到某些东西-似乎必须是一些琐碎的事情,就像函数是在其他当前目录中启动的一样-(但pwd和ls显示了目录始终是正确的... ???)-任何帮助或指导都将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)