プロが教えるわが家の防犯対策術!

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

A 回答 (2件)

まず、bashの変数は何も指定しなければ、グローバル変数として


扱われます。
ですので、グローバル変数をわざわざ宣言する方法はありません。
ローカル変数は、関数の中では使用可能ですが、'local'で宣言
しなくてはなりません。

下記ページの局所変数の項目を参照してください。
http://www.fireproject.jp/feature/bash/basic/var …


それでは、なぜ、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
    • good
    • 1
この回答へのお礼

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

お礼日時:2007/02/28 18:51

bashの拡張機能を使うと#1さんの書いた方法もありますが、shの基本機能だけで行くなら、パイプを使わなければいいので、



count=0
while read i
do
count=`expre $count + 1 `
done < file
echo $count
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
パイプを使った場合の動作をまったく理解していませんでした。

教えていただきました方法を参考にスクリプトが組めそうです。

お礼日時:2007/02/28 18:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!