2

我有一组脚本,它们共享一些用作状态标志的环境变量。

考虑:

./script1.sh; ./script2.sh; # I execute 2 scripts within the same shell.

现在,这些脚本中的每一个都会定期执行以下脚本,以设置(刷新)环境变量:

. ./setEnvVariables.sh #This executes it in the context of the current shell and thus making the environment variables accessible across both scripts.

  • setEnvVariables.sh 包含我想在同一 shell 中执行的其他脚本中使用的变量。
  • 其中一些变量充当标志,可以在script1.sh,script2.sh,..脚本执行过程中在文件中手动更改。

另一种方法是将标志保存在文件中并创建典型的 get/set 函数来读取文件并返回/设置标志值。这些标志由我设置以简化对脚本功能的控制。

有没有更好的方法来处理这个?这有点属于getter-setter设计模式......

4

1 回答 1

5

如果您使用的是 ksh93,而不是 ksh88,则更优雅的方法是使用学科函数来实现这一点。

它们允许为 shell 变量实现 getter et setter 函数。然后,您可以创建一个从共享存储区域(文件、ldap 目录、数据库等)中选择变量值的 getter,以及一个更新同一后端的 setter。

这是一个简单的例子:

a.ksh

function shared.get
{
    .sh.value=$(</tmp/shared)
}
function shared.set
{
    echo ${.sh.value}>/tmp/shared.new
    mv /tmp/shared.new /tmp/shared
}

set -x
echo $shared
shared=22
echo $shared
./b.ksh
echo $shared

b.ksh

function shared.get
{
    .sh.value=$(</tmp/shared)
}
function shared.set
{
    echo ${.sh.value}>/tmp/shared.new
    mv /tmp/shared.new /tmp/shared
}

set -x
echo $shared
shared=11
echo $shared

b.ksh 作为子 shell 运行会修改父进程 (a.ksh) 中共享变量的值。

$ ./a.ksh
+ echo 11
11
+ shared=22
+ echo 22
22
+ ./b.ksh
+ echo 22
22
+ shared=11
+ echo 11
11
+ echo 11
11
于 2012-12-05T15:43:34.863 回答