如何更改属于另一个变量值一部分的变量

如何更改属于另一个变量值一部分的变量

我目前有这个函数可以确定数据库用户应该是什么帐户:

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

这是可行的,但可能是有害的。我建议在编写脚本时不要采用这种抽象级别。

考虑一下将来谁会读你的剧本。如果是其他源代码,他们将是程序员;对于脚本,他们可能是需要一些小修复或小定制的用户或管理员。它是不经济的 利用他们的时间和智力只是为了节省一点处理器时间(或消除主观代码气味)。吻是脚本范例。

因此,请取消循环中代码的注释,不要“感觉不好”。

相关内容