2017-12-07 1 views
0

私は行数をカウントするための簡単なスクリプトを作りたかった私の.scalaのファイルがあります。whileブロックの後にbashで間違った変数値を表示します。どうして?

#!/bin/bash 

counter=0; 
find -iname "*.scala" | while read f; do 
    lc=$(cat $f | wc -l); 
    counter=$((counter+lc)); 
    echo "$lc $counter"; 
done 
echo "final result: $counter"; 

をしかし残念ながら、これはここで間違って何

20 20 
204 224 
212 436 
final result: 0 

出力しますか?

答えて

3

whileループの前にpipeを使用するため、この問題が発生します。

このようにすると、bashが自動的に新しいサブシェルを作成します。すべての変更は新しいコンテキストで実行され、コンテキストが閉じられたときには伝播されません。代わりに

使用process substitution

#!/bin/bash 

counter=0; 
while read f; do 
    lc=$(cat $f | wc -l); 
    counter=$((counter+lc)); 
    echo "$lc $counter"; 
done < <(find -iname "*.scala") 
echo "final result: $counter"; 
関連する問題