2011-10-04 94 views
0

我的程序涉及多个调用具有不同参数的KornShell(ksh)脚本文件的JAVA线程。该脚本文件依次调用某些返回某些状态的SQL命令 。我将此状态作为脚本的一部分存储在变量中,并检查从SQL返回的值并采取适当的操作。 问题是所有脚本都在同一个会话中执行,因此变量名将在所有线程中共享。由于这些线程异步工作,我希望这个链接被打破。我能想到的最简单的解决方案是为每个线程使用一个不同的变量(使用脚本的一些输入参数作为标识符),但这意味着该变量的名称需要是动态的。也就是说,我应该能够在另一个变量的名称中使用变量的值。 这甚至可能吗?如果是,那我该怎么做?使用变量'值'在KornShell中定义变量'名称'

Java线程 - 同一会话| | | Java线程 - - |相同的脚本| | | Java线程 - - - |同名var name | | |
Java线程 - - | (同样的var | |名称会导致| Java线程 - |不一致)|

如果没有,那么任何人都可以提出一种替代方法吗?这方面的一个重要方面是,JAVA部分是一个服务器程序,并且将运行更长的持续时间,所以我需要手动'取消'这些变量。 (我不能做的事情,如果我使用数组来存储所有这些)

+0

变量是一个shell脚本变量还是数据库中的一个变量? –

+0

它是一个shell脚本变量。 由于我发布了这个,我取得了一些进展。 现在,脚本的每个调用实际上都会声明自己的变量并设置其自己的值 例如,调用1:var_1 /调用2:var_2 /调用3:var_3 但是当我尝试在if命令中使用此例如[$ var_ $ val -eq 0];则... 无法取得适当的值 – angryInsomniac

+0

在shell脚本中设置的变量对于该shell脚本 是私有的,并且不能被您启动的其他shell脚本读取或使用。 这意味着您不应该在shell脚本中使用变量名称 。 如果您确实需要每个脚本中的唯一值,则可以使用特殊的 shell变量'$$',该变量是该 运行脚本的唯一进程号。 –

回答

1

...我将此状态作为(ksh)脚本的一部分存储在变量中,并检查从SQL并采取适当的措施。问题在于所有脚本都在同一个会话中执行,因此变量名将在所有线程中共享。

所以总结:

  • 每个线程使用System.exec(...)或等同于运行ksh脚本

  • ksh脚本使用一个变量的状态存储从运行的SQL查询。

在这种情况下,不会在运行脚本的不同实例之间共享ksh变量。每个ksh实例都有自己的变量集。

对于这里发生的事情,必须有另一种解释。


你说if [ $var_$val -eq 0 ]; then ...给出了错误的答案。我不惊讶。 $var_$val不可能扩展到一个数字,所以测试看它是否为零将始终失败。

+0

感谢您指出变量不会被共享,那个错误的假设让我对这个问题的分析感到困惑,一旦我知道共享不是我在其他地方看到的问题并理解发生了什么。 – angryInsomniac