動機
以下は、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