• ベストアンサー

【シェルスクリプト】 ローカル変数、グローバル変数

シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • ballville
  • ベストアンサー率47% (233/487)
回答No.1

まず、bashの変数は何も指定しなければ、グローバル変数として 扱われます。 ですので、グローバル変数をわざわざ宣言する方法はありません。 ローカル変数は、関数の中では使用可能ですが、'local'で宣言 しなくてはなりません。 下記ページの局所変数の項目を参照してください。 http://www.fireproject.jp/feature/bash/basic/variable.html それでは、なぜ、skip_jackさんのスクリプトで、 $countの値が変わらなかったのか、というと、 パイプの後でwhile文を起動するときにサブシェルが 起動されてしまったからです。 下記参照 http://dsas.blog.klab.org/archives/50703133.html というわけで、上記ページのコメントに書かれている 名前つきパイプの手法を使って、 次のようにしてみたらどうでしょう。 #!/bin/bash count=0 while read i do count=`expr $count + 1 ` done < <(cat file) echo $count

skip_jack
質問者

お礼

目から鱗です。 参考になるURLも教えていただきましてありがとうございました。 大変感謝しております。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

bashの拡張機能を使うと#1さんの書いた方法もありますが、shの基本機能だけで行くなら、パイプを使わなければいいので、 count=0 while read i do count=`expre $count + 1 ` done < file echo $count

skip_jack
質問者

お礼

ご回答ありがとうございます。 パイプを使った場合の動作をまったく理解していませんでした。 教えていただきました方法を参考にスクリプトが組めそうです。

関連するQ&A