Closed1

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

ranran

困った

whileの中で変数の更新をしたが更新されなかった

#!/bin/bash

found=0

echo "1 2 3 4" | while read i
do
  if [[ $i -eq 1 ]]
  found=1
  fi
done

echo "$found"  # 0が出力される

原因

まったく同じお悩みをみつけた
https://ja.stackoverflow.com/questions/73759/シェルスクリプトで-while-ループ内の変更が反映されない

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

解決

for文に書き直して解決

#!/bin/bash

found=0

for i in 1 2 3 4
do 
  if [[ $i -eq 1 ]]
  found=1
  fi
done

echo "$found"  # 1が出力される
このスクラップは4日前にクローズされました