- - PR -
while文の中の変数をwhile文の外で使いたいのですが・・・
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-10-21 15:20
皆さん、お疲れ様でございます。
Bシェルスクリプトを作成しているのですが、whileの中でセットした変数の値を そのままwhileの外で使うことができず、困っております。 どなたかご助言いただけませんでしょうか。 --------------------------------------------- #! /usr/bin/sh cat /tmp/config.file | while read A B C do TOTAL=1 TOTAL=`expr $A + $B + $C + $TOTAL` [ $TOTAL -le 100 ] || break done echo "Result: $TOTAL" --------------------------------------------- *A,B,C,TOTALは整数です 実行結果:Result: 0(本来ならば100以上) よろしく御願いします。 | ||||||||
|
投稿日時: 2004-10-21 16:49
こんにちは。うーん、何か根本的に間違っている感じがします。 ループを使ったサンプルをあげておきますので、参考にしてくださいな。 # デバッグなので、ご自身で出来るようになった方がいいですよ^^; # 先ほど一度アップしたのですが、サンプルが良くなかったので修正しました。
↓出力 10 20 30 #入力 input: 10 20 30 Value: 60 40 50 60 #入力 input: 40 50 60 Value: 210 break Result: 210 _________________ 脱線のNUSHI(見習い) ☆⌒(*^▽°) | ||||||||
|
投稿日時: 2004-10-21 17:06
シェルスクリプトの中でもパイプ(|)を使うとパイプ先の
処理は別プロセス(子シェル)になります。 つまりwhile中のTOTALと最後のTOTALは同じ名前の 別プロセスの変数という事になりますね。 #! /usr/bin/sh cat /tmp/config.file | ( while read A B C do TOTAL=1 TOTAL=`expr $A + $B + $C + $TOTAL` [ $TOTAL -le 100 ] || break done ; echo "Result: $TOTAL" ) こんな感じにすれば良いんではないかと。 | ||||||||
|
投稿日時: 2004-10-21 18:29
つぐみさん、
ご回答ありがとうございます。早速試してみたいと思います。 水無月 遊々さん、 すみません。私の質問の仕方が全面的に悪いのですが、 誓ってデバッグをさぼったわけではございません。あのスクリプトは 「Bシェルでfileをcatした結果をwhile readしたらwhile内の変数が while外に引き継がれなかった」ということを端的に表すために 例として即興で作成したもので、あのスクリプトをどうこうしたいという わけではありませんでした。すみませんでした。 ありがとうございました。 | ||||||||
|
投稿日時: 2004-10-21 19:16
while read LINE
do echo "$LINE" done < ファイル名(複数行の内容) の常用の形で書けば何の問題もないです、 | を使ったからなのです cat >ABC.txt <<data 99 88 77 11 22 33 data TOTAL=0 while read A B C do TOTAL=`expr $A + $B + $C + $TOTAL` done < ABC.txt echo $TOTAL [ メッセージ編集済み 編集者: MMX 編集日時 2004-10-21 19:19 ] | ||||||||
|
投稿日時: 2004-10-21 20:48
>Age35 恋しくてさん
こちらこそ、失礼な書き込みでした。 申し訳ございません。ご容赦頂ければ嬉しく思います。 …と、いうより、私の方が勉強不足でした。大変失礼しました。 #ご質問の意図をくみ取れずに申し訳ありません。 [ メッセージ編集済み 編集者: 水無月 遊々 編集日時 2004-10-21 20:50 ] | ||||||||
|
投稿日時: 2004-10-22 14:58
MMXさん、有難うございます。
つぐみさん、MMXさんにお教えいただいた方法を使いましたが、 うまくいきませんでした。。。 MMXさんの手法でテストした結果を以下に記します。 しつこくて申し訳ありませんが、何かお分かりでしたらお助けください。 ※以下はテスト用スクリプトであり、うまくいかないことを この場でお知らせするためのものです。よろしくお願いします。 -----テスト用スクリプト内容 #!/usr/bin/sh UNA=1 echo $UNA start while read A B do UNA=`expr $UNA + $A + $B` echo $UNA status done < kikiin echo $UNA end -----読込ファイル(kikiin)内容 1 2 3 4 -----実行結果(sh -vx結果) #!/usr/bin/sh UNA=1 UNA=1 echo $UNA start + echo 1 start 1 start while read A B do UNA=`expr $UNA + $A + $B` echo $UNA status done < kikiin + read A B + expr 1 + 1 + 2 UNA=4 + echo 4 status 4 status + read A B + expr 4 + 3 + 4 UNA=11 + echo 11 status 11 status + read A B echo $UNA end + echo 1 end 1 end 皆さんのおっしゃる通り、同じ名前の変数$UNAでも while内と外で違うことが判明しましたが、 なぜ教えていただいたやり方でダメなのか分かりません・・・。 (私も絶対いけると思っておりました。) よろしくお願いします。 | ||||||||
|
投稿日時: 2004-10-22 15:42
上手く・・・行ってる。
|