73761


コマンドの結果を while read でループする様な処理があって  
その中で数値を加算する様な処理を追加したんですが  
ループ内での変更を反映した結果が取得できません

以下の様なテストコードで再現しました

[code]

    #!/bin/bash
    
    sum=1
    
    echo "2
    3
    4" | while read i
    do
      echo "i=$i"
      ((sum+=i))
      echo "sum=$sum"
    done
    
    echo "result=$sum"
    
[/code]

実行結果

[code]

    i=2
    sum=3
    i=3
    sum=6
    i=4
    sum=10
    result=1
    
[/code]

ループ内ではきちんと加算されているのにループを出ると1に戻ってしまいます

while read ではなく

[code]

    for ((i=0; i < 10; i++));
    
[/code]

にかえてみるとループを出ても加算された値が取得できました

なぜこういうことがおこるんでしょうか？

ループ内で加算した数値をループ外で参照するにはどのようにかけばいいのでしょうか


CC BY-SA 4.0
2021-02-02T08:59:05.187
73759
2021-02-02T16:39:49.313
2021-02-02T16:39:49.313
3060
question
bash
シェルスクリプトで while ループ内の変更が反映されない


while以降が子プロセスで実行されているからです。  
子プロセスで変数を変更しても親プロセスは関知しません。  
※forループの書き方によってはループ内の処理が別プロセスとして実行される場合があります。  
ループの内外でプロセスIDを出力(※)してみると異なるPIDになっていることがわかります。  
※ echo ${BASHPID}

[code]

    #!/bin/bash
    
    sum=1
    
    echo ${BASHPID}
    echo "2
    3
    4" | while read i
    do
      echo ${BASHPID}
      echo "i=$i"
      ((sum+=i))
      echo "sum=$sum"
    done
    
    echo "result=$sum"
    
[/code]


CC BY-SA 4.0
2021-02-02T09:18:07.327
73761
2021-02-02T09:18:07.327
35558
73759
answer