我目前有这个函数可以确定数据库用户应该是什么帐户:
calc_id_value(){
case $id_opt in
"") id_value="$script_id@$SID"
sql_in_db=$id_value
;;
sys) id_value="sys/$sys_password@$SID as sysdba"
sql_in_db=$id_value
;;
system) id_value="system/$system_password@$SID"
sql_in_db=$id_value
;;
*) echo "Error in calc_id_value()"
;;
esac
}
稍后,我将读取列表的每一行。每行都是一个数据库。下面的循环将转到每个数据库并运行调用的函数,sql_in
该函数仅登录并运行一个文件。问题是它不会转到下一个数据库。似乎是因为它仍然将$id_value
=解释为$script_id@$database1
,而它应该是 = $script_id@databasen
。
while read sid
do
SID=$sid
export SID
# calc_id_value
sql_in_db=$id_value
sql_in
done < "$list_value"
问题是它不会转到下一个数据库。看来是因为它在应该是 = 的时候继续解释$id_value
= 。$script_id@$database1
$script_id@databasen
calc_id_value
但是,如果我在循环内取消注释,它就会起作用。如果我允许这样做,那感觉就像是糟糕的编程习惯。然后,我将强制当前的循环迭代返回到case
它的声明。有没有更好的办法?如果可能的话,我希望能够在读取每行后动态更改变量$SID
的部分id_value
。
答案1
这是可行的,但可能是有害的。我建议在编写脚本时不要采用这种抽象级别。
考虑一下将来谁会读你的剧本。如果是其他源代码,他们将是程序员;对于脚本,他们可能是需要一些小修复或小定制的用户或管理员。它是不经济的 利用他们的时间和智力只是为了节省一点处理器时间(或消除主观代码气味)。吻是这脚本范例。
因此,请取消循环中代码的注释,不要“感觉不好”。