2016-09-20 6 views
0

さて、Bashを扱う際に問題があり、グローバル変数が不足しています。私が抱えている問題は、whileループの中で、forループを実行する必要があり、そのループのためにスクリプトを呼び出すことになり、変数$ NAMEを動的に変更する必要があるということです。残念ながら、いくつかのオプションを試してみるまで、私はそれが何であるか分かりません。変数は、元のプロセスで設定された後は変更したくないということです。私は今日これについて多くの研究を行ってきましたが、そのようなファイルでファイルを読むとサブシェルが開き、親プロセスで値を編集できないことがわかりました。私は変数を動的にエクスポートするためにソースにいくつかのファイルを作成しようとしましたが、どちらもうまくいきません。サブプロセスの値をBashで編集しますか?

編集:この例はトリビアルですが、私は仕事で使っているのと同じ論理です。作業コードを表示することはできません。

#!/usr/bin/env bash 
FILE=$1 
SCRIPT="FOO" 
NAME="TEST" 

#create script 
cat > "${SCRIPT}" <<EOF 
HELLO WORLD, $NAME 
EOF 

while read line; do 
echo $line 
echo $SCRIPT 
    for i in `seq 1 10`; do 
    (
    NAME="MEGAMAN" 
    echo $NAME 
    ) 
    done 
done < "$FILE" 
#echo $NAME 
cat > "${SCRIPT}" <<EOF 
HELLO WORLD, $NAME 
EOF 

マイ出力:

[email protected]:~/workspace/Script $ ./Main FOO 
HELLO WORLD, TEST 
FOO 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN 
MEGAMAN **this output is fine 

、ファイルはそれが出力:

HELLO WORLD, TEST **This file should say MEGAMAN. 
+1

によって "グローバル変数の欠如" をライン

./child-script.sh 

を交換?ハァッ? **すべての**変数は、そうでないと宣言しない限り、bashでグローバルです。 –

+1

...あなたの問題は、サブプロセスでコードを実行しているので、そこに設定したグローバル変数は、そのサブプロセスが終了するとクリアされます。 [BashFAQ#24](http://mywiki.wooledge.org/BashFAQ/024)も参照してください。サブプロセスをフォークする場合は、他の言語のグローバルと同じです。 –

+0

...最も簡単な解決策は、変数を設定するコードがインプロセスであることを保証することです。 '()'を '{}'に置き換えた場合、あなたは設定されます。 –

答えて

1

子プロセスからの変数を変更することは不可能であることサブシェルまたはいくつかの他のシェルスクリプト。そのようなことをする必要がある場合は、サブプロセスが親と通信する方法を見つけなければなりません。たとえば、外部スクリプトを呼び出していて、そのスクリプトによって計算された値を親スクリプトの変数に格納する場合、その値をstdoutに出力して親に取り込むことができますプロセス、例えば

# child-script.sh: 
myvar=.... # compute some value 
echo "$myvar" # put that at the end of the script 

と親で、

myvar="$(./child-script.sh)" 
+0

しかし、変数を渡す必要がある場合、渡す必要がある変数はforループの変数です。私はこの場合、1から10の数字になるだろうと思いますか? $ NAME – user3505901

+0

@ user3505901のようにスクリプトに補間する必要があります。 '$()'はサブシェルを実行します。サブシェルは、変数の現在の値を含め、親のすべての状態を継承します。だから、もしあなたがそのルートに行きたいなら 'myvar = $(何か" $ i "を含む)'を実行することができます(ただし、あなたがサブシェルを完全に避けることができなければそうしません)。 –

関連する問題