ablog

不器用で落着きのない技術者のメモ

bash でループの中でループの外のシェル変数の値を変更する

$ a=1
$ ls|while read LINE
> do
> a=2
> done
$ echo $a
1

と、ループの中で変数 a の値を変更してもループの外の変数 a の値は変わらない。

forやwhile文などのリダイレクト処理はカレントシェルではなく、 サブシェルで実行される

http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/sh-text/sh/node58.html

かららしい。

$ a=1
$ for i in `ls`
> do
> a=2
> done
$ echo $a
2

と書き換えると、ループの中で変数 a の値を変更するとループの外の変数 a の値が変わる。