bashのパイプ内外で使用する変数について
bashでシェルスクリプトを書くとき、パイプ"|"を使ってwhileのループの処理を行う場合、ループ内の変数をループ外に引き継げない。
例:
seq 10 > seq10file cat seq10file 1 2 3 4 5 6 7 8 9 10
このファイルに対して
>vim test.sh #!/bin/bash ln=1 cat seq10file | while read f do echo "$ln" let ln=ln+1 done echo "-------" echo "$ln"
>chmod +x test.sh
を実行する。whileループ内ではlnがインクリメントされるのでループ脱出後の変数lnは11になると思ったら
>./test.sh 1 2 3 4 5 6 7 8 9 10 ------- 1
1のままである。調べて見るとパイプを使用すると別プロセスが生成されるため、パイプ内のwhileループのプロセスで完結し、変数が引き継がれないためらしい。
つまり、パイプ内外で変数を共有するにはファイルを介するしかないんですかね。
#!/bin/bash ln=1 cat seq10file | while read f do echo "$ln" let ln=ln+1 echo "$ln" >tmp_$$ done ln=`cat tmp_$$` echo "-----" echo "$ln" rm tmp_$$ >./test.sh 1 2 3 4 5 6 7 8 9 10 ----- 11
意図通りになったけどちょっとダサい。
それでは、別のshellではどうだろうか。
#!/bin/zsh ln=1 cat seq10file | while read f do echo "$ln" let ln=ln+1 done echo "-------" echo "$ln" > ./test.sh 1 2 3 4 5 6 7 8 9 10 ------- 11
おやうまくいった。