0

2 つの bash スクリプト間で配列データを渡す必要があります。

両方のスクリプトがソース (etc/config) であるコントローラー構成があります。このファイルでは、3 つの配列が宣言されています。

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 を実行してサブシェルを作成し、sh をソースに置き換えます。

source scriptname.sh

このように、スクリプトはサブシェルを作成せず、スクリプトで定義した変数はスクリプトの終了後も存在します。

例:

#!/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

アレイは異なるシェル間で共有されません。各スクリプトは個別のプロセスとして実行され、独自のプライベート アレイを構築しますが、これらはプロセスが終了すると失われます。でスクリプトを実行するという@Upasana Shuklaの提案はsource機能しますが(サブシェル/異なるプロセスとしてではなく、メインシェルプロセスで実行されるため)、スクリプトを並行して実行することはできません。それらを並行して実行したい場合、おそらく最も簡単な方法は、配列ではなく一時ファイルに出力することです。

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 に答える