2013-04-05 39 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