2013-04-05 60 views
0

我需要在两个bash脚本之间传递数组数据。通过多个脚本向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[@]} 

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

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

在此先感谢!

回答

1

的阵列不是不同的炮弹之间共享。每个脚本将作为一个单独的进程运行,并构建它自己的私有数组,但当进程退出时这些私有数组会丢失。 @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" 
1

在脚本中,您要创建这样做的sh $ Z A子shell,与源取代sh的,是这样的:以这种方式

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 
$ 
+0

非常感谢!我会放弃它,非常感谢! – 2013-04-05 21:38:58