- PR -

while文の中の変数をwhile文の外で使いたいのですが・・・

投稿者投稿内容
壬生義士
会議室デビュー日: 2004/05/07
投稿数: 18
投稿日時: 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以上)

よろしく御願いします。
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-10-21 16:49
引用:

Age35 恋しくてさんの書き込み (2004-10-21 15:20) より:
Bシェルスクリプトを作成しているのですが、whileの中でセットした変数の値を
そのままwhileの外で使うことができず、困っております。
どなたかご助言いただけませんでしょうか。



 こんにちは。うーん、何か根本的に間違っている感じがします。
ループを使ったサンプルをあげておきますので、参考にしてくださいな。

# デバッグなので、ご自身で出来るようになった方がいいですよ^^;
# 先ほど一度アップしたのですが、サンプルが良くなかったので修正しました。

コード:
#! /usr/bin/sh

TOTAL="0"
read A B C
while [ $? -eq 0 ]; do
    echo "input: $A $B $C"
    TOTAL=`expr $A + $B + $C + $TOTAL`

    echo "Value: $TOTAL"
    if [ $TOTAL -ge 100 ]; then
        echo break
        break
    else
        read A B C
    fi
done

echo "Result: $TOTAL"





↓出力
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
投稿数: 1
投稿日時: 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/05/07
投稿数: 18
投稿日時: 2004-10-21 18:29
つぐみさん、
ご回答ありがとうございます。早速試してみたいと思います。

水無月 遊々さん、
すみません。私の質問の仕方が全面的に悪いのですが、
誓ってデバッグをさぼったわけではございません。あのスクリプトは
「Bシェルでfileをcatした結果をwhile readしたらwhile内の変数が
 while外に引き継がれなかった」ということを端的に表すために
例として即興で作成したもので、あのスクリプトをどうこうしたいという
わけではありませんでした。すみませんでした。

ありがとうございました。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 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 ]
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-10-21 20:48
>Age35 恋しくてさん

 こちらこそ、失礼な書き込みでした。
申し訳ございません。ご容赦頂ければ嬉しく思います。
…と、いうより、私の方が勉強不足でした。大変失礼しました。

#ご質問の意図をくみ取れずに申し訳ありません。


[ メッセージ編集済み 編集者: 水無月 遊々 編集日時 2004-10-21 20:50 ]
壬生義士
会議室デビュー日: 2004/05/07
投稿数: 18
投稿日時: 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内と外で違うことが判明しましたが、
なぜ教えていただいたやり方でダメなのか分かりません・・・。
(私も絶対いけると思っておりました。)

よろしくお願いします。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-10-22 15:42
上手く・・・行ってる。

スキルアップ/キャリアアップ(JOB@IT)