2014-01-08 17 views
9

私は、関数、可変スコープ、場合によってはサブシェルに関して私のスクリプトとちょっと混乱しています。 postでパイプがサブシェルを生成し、親シェルがサブシェルからの変数にアクセスできないことがわかりました。これはbackdicksで実行されるcmdsの場合と同じですか?スクリプト内のbashシェルスクリプトと関数の可変スコープ

人を傷つけないように、私は100 +ラインスクリプトを短縮しましたが、重要な要素(バッククック、パイプなど)を忘れないようにしました。うまくいけば、私は何も残さなかった。

global1=0 
global2=0 
start_read=true 

function testfunc { 
    global1=9999 
    global2=1111 
    echo "in testfunc" 
    echo $global1 
    echo $global2 
} 

file1=whocares 
file2=whocares2 

for line in `cat $file1` 
do 
    for i in `grep -P "\w+ stream" $file2 | grep "$line"` # possible but unlikely problem spot 
    do 
     end=$(echo $i | cut -d ' ' -f 1-4 | cut -d ',' -f 1) # possible but unlikely spot 
     duration=`testfunc $end`  # more likely problem spot 
    done 
done 

echo "global1 = $global1" 
echo "global2 = $global2" 

私は私のスクリプトを実行するときに、最後の行はglobal1 = 0はしかし、私の関数testfuncで、global1は9999に設定されますと、デバッグのMSGは、関数内で、少なくとも、それが9999であることをプリントアウトすると言います。ここ

つの質問:

  1. バッククォートは、サブシェルを起動し、これ私のスクリプトではありません 仕事をするのですか?
  2. この問題を回避するにはどうすればよいですか?

ご協力いただきありがとうございます。

+1

1のような何かを試すことができます:バッククォートを削除し、関数定義の割り当てを移動します。あるいは、global1 = 'testfunc $ end' – damienfrancois

+0

と書くことを除いて、それらのネストされた 'for'ループは本当にねじれて非効率です。あなたは 'grep -P" \ w + stream "" $ file2 "と言っていると思います。 grep -f "$ file1" |読んでいる間はi; do' ... – tripleee

+0

@damienfrancois、あなたの返事のためのthx。 testfuncはいくつかのグローバル変数を変更します。私はそれが私が含まないことを忘れていたことだと思います。 – Classified

答えて

2

あなたは、はい、彼らは2クイックフィックス行う

global1=0 
global2=0 
start_read=true 

function testfunc { 
    global1=9999 
    global2=1111 
    echo "in testfunc" 
    echo $global1 
    echo $global2 
    duration=something 
} 

file1=whocares 
file2=whocares2 

for line in `cat $file1` 
do 
    for i in `grep -P "\w+ stream" $file2 | grep "$line"` # possible but unlikely problem spot 
    do 
     end=$(echo $i | cut -d ' ' -f 1-4 | cut -d ',' -f 1) # possible but unlikely spot 
     testfunc $end  # more likely problem spot 
    done 
done 

echo "global1 = $global1" 
echo "global2 = $global2" 
3

Do the backticks spawn a subshell and thus making my script not work?

はい、彼らがやるとサブシェルで変数に加えた変更は、親シェルでは表示されません。

How do I work around this issue?

おそらく、サブシェルを産卵避けるため、このループ試すことができます:PS

while read line 
do 
    while read i 
    do 
     end=$(echo $i | cut -d ' ' -f 1-4 | cut -d ',' -f 1) 
     duration=$(testfunc "$end") 
    done < <(grep -P "\w+ stream" "$file2" | grep "$line") 
done < "$file1" 

を:しかしtestfuncはまだサブプロセスで呼び出されます。

関連する問題