bashのwhile文のスコープ

動機

以下は、FILE中で、”string”を含む列をLISTに格納していきたい、というスクリプトであるが、whileのスコープのせいでうまくいかない。


LIST=() cat FILENAME | while read line do if [ "`echo "$line" | grep "string"`" ] ; then LIST+=($line) fi done echo ${ERROR_LIST[@]}


実行結果は、

$ ./script.sh
# 何も表示されない

whileでパイプを使うとサブシェルが動いてるそうで。普通の言語の気持ちで、bashの変数はグローバル変数だと思っているといけないみたい。

解決


LIST=() IFS=$'\n'; for line in `cat FILENAME` do if [ "`echo "$line" | grep "string"`" ] ; then LIST+=($line) fi done echo ${ERROR_LIST[@]}

などと、forを使ったり、パイプを使わないwhile文を書けばよい。

参考:

http://sememo.blue-robin.jp/?p=297

http://www.atmarkit.co.jp/ait/articles/1209/14/news147.html