私は、関数、可変スコープ、場合によってはサブシェルに関して私のスクリプトとちょっと混乱しています。 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のような何かを試すことができます:バッククォートを削除し、関数定義の割り当てを移動します。あるいは、global1 = 'testfunc $ end' – damienfrancois
と書くことを除いて、それらのネストされた 'for'ループは本当にねじれて非効率です。あなたは 'grep -P" \ w + stream "" $ file2 "と言っていると思います。 grep -f "$ file1" |読んでいる間はi; do' ... – tripleee
@damienfrancois、あなたの返事のためのthx。 testfuncはいくつかのグローバル変数を変更します。私はそれが私が含まないことを忘れていたことだと思います。 – Classified