跨多个 korn (ksh93) shell 脚本(getter-setter)使用的环境变量

Ken*_*war 2 unix ksh solaris environment-variables getter-setter

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

考虑:

./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,..脚本执行过程中在文件中手动更改。

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

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

jll*_*gre 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)