Bash:whileループで変数を増やしますか?

Bash:whileループで変数を増やしますか?

セット内の各ファイルについて、ファイルの各行を把握して文字列を検索するbashスクリプトがあります。次に、行をコンマに分割し、7番目の要素を浮動小数点に変換し、その値だけ累計を増やします。

次のようになります。

for filename in data*.CSV; do
   echo $filename
   ACTUAL_COST=0
   grep '040302010' $filename | while read -r line ; do
       IFS=',' read -a array <<< "$line"
       ACTUAL_COST=$(echo "$ACTUAL_COST + ${array[7]}" | bc)
       echo $ACTUAL_COST
   done
   echo $ACTUAL_COST
done

しかし、私が経験している問題は、これが次のような出力を生成することです。

53.4
72.2
109.1
0

最後の値は常に0です。少し検索してみると、ループがwhileサブシェルで実行されるため、外部変数は変更されないようです。

関数内で内部ループを実行する必要があるかもしれません。

ベストアンサー1

これはシェルスクリプトを書く方法ではありません。ファイルの各行に対して複数のコマンドを順番に実行しています!

ここでは、次のようなものが欲しい:

awk -F, '/040302010/ {actual_cost += $7}
         ENDFILE {print FILENAME ":", +actual_cost; actual_cost=0}
        ' data*.CSV

(GNU awkを仮定)。

それは一つすべてのファイルのコマンドの総数。

おすすめ記事