0

我需要在两个 bash 脚本之间传递数组数据。

我有一个控制器配置,两个脚本都来自(etc/config)。在这个文件中,我声明了三个数组:

declare -a exeSuccess
declare -a exeFailure
declare -a exeUnknown

我的主脚本并行调用各种下标,这些下标收集数据并输出到数组。

下标:

exeSuccess+=($OUTPUT) #This works while the script is running

主脚本:

for z in $(ls -l scripts)
do
  sh $z &
  wait
done

echo "Validating Script Output"
echo ${exeSuccess[@]}

当脚本运行时,数组会根据需要填充,但是当它们退出时,数组会被清空(我假设被破坏)。

有谁知道我如何在主脚本的执行过程中保持这个数组的初始化?

提前致谢!

4

2 回答 2

1

在您的脚本中,您通过执行 sh $z 创建一个子 shell,将 sh 替换为 source,如下所示:

source scriptname.sh

这样,您的脚本将不会创建子shell,并且即使在脚本终止后,您在脚本中定义的变量也将存在。

例子:

#!/bin/bash
#script.sh

source script2.sh;
echo ${exeSuccess[0]};
echo ${exeSuccess[1]};


#!/bin/bash
#scipt2.sh
declare -a exeSuccess;
exeSuccess[0]="hello";
exeSuccess[1]="hello1";

输出:

$ source script1.sh
hello
hello1
$ echo ${exeSuccess[0]}
hello
$ echo ${exeSuccess[1]}
hello1
$ 
于 2013-04-05T21:29:57.697 回答
1

数组不在不同的 shell 之间共享。每个脚本都将作为一个单独的进程运行,并构建自己的私有数组,但是当进程退出时这些会丢失。@Upasana Shukla 运行脚本的建议source将起作用(因为它在主 shell 进程中运行它们,而不是作为子 shell/不同进程),但不允许您并行运行脚本。如果要并行运行它们,最简单的方法可能是将它们输出到临时文件而不是数组:

export tmpdir="$(mktemp -d "/tmp/$(basename "$0").XXXXXX")" || {
    echo "Error creating temporary directory" >&2
    exit 1
}

for z in scripts/*; do # Please don't parse ls
   sh "$z" &
done
wait

echo "Validating Script Output"
cat "$tmpdir/exeSuccess"
rm -R "$tmpdir"

在各个脚本中:

echo "$OUTPUT" >>"$tmpdir/exeSuccess"
于 2013-04-05T21:40:01.670 回答