見出し画像

【Linux】変数の中身が更新されない?

【問題】
ループ処理を通して、変数の中身を更新するようにコーディングしたが、実行すると予想に反して中身が更新されていない。

#!/bin/bash

sum=1

echo "2
3
4" | while read i
do
  echo "i=$i"
  ((sum+=i))
  echo "sum=$sum"
done

echo "result=$sum"

(出力結果)

i=2
sum=3

i=3
sum=6

i=4
sum=10

result=1

【原因】
while以降が子プロセスで実行されているから。
※パイプ(|)から後ろで実行している処理は子プロセスで行われ、子プロセスで変数を変更しても親プロセスは関知しない。

【解決策】
for文で書き直してみる。

#!/bin/bash

sum=1
for i in 2 3 4
do 
  echo "i=$i" 
  ((sum+=i)) 
  echo "sum=$sum"
done

echo "result=$sum"

(出力結果)

i=2
sum=3

i=3
sum=6

i=4
sum=10
result=10

【参考資料】
シェルスクリプトで while ループ内の変更が反映されない


この記事が気に入ったらサポートをしてみませんか?