gooサービスにログインしづらい事象について

シェルスクリプト初心者です。
whileループを使ったシェルスクリプトを作成し実行したところ、
想定しているような動作にならないので、何が悪いのかを教えていただけると幸いです。

【作成したsh】
#!bin/sh

flg=0

cat ./data/test.txt | while read line
do
echo ${line}
flg=1
done

echo "flg = "${flg}

exit 0



【./data/test.txtの内容】
test
test
test


【実行結果】
test
test
test
flg = 0


whileループ内で変数flgに1を代入しているのですが、
whileループを抜けたところでflgをechoすると、値が0(初期値)になってしまっております。
ちなみに以下のように記述を変更したところ、想定どおりの実行結果が得られました。

【修正したsh】
#!bin/sh

flg=0

while read line
do
echo ${line}
flg=1
done < ./data/test.txt

echo "flg = "${flg}

exit 0



【実行結果】
test
test
test
flg = 1


前者のシェルスクリプトでは、何がダメで変数への代入ができていないのか、
教えていただけないでしょうか。

検証環境はUbuntu 16.04 LTSです。

よろしくお願いします。

A 回答 (1件)

上だとパイプを使っているため while がサブシェルで実行されてるんだと思う.



サブシェルで変数を変えてももとのシェルでは変わりませんからね.
    • good
    • 1
この回答へのお礼

なるほど。サブシェルという概念があるのですね。
そこを把握せずにパイプを使ったシェルを書いておりました…

Tacosan様の回答で疑問が解消されました。
ありがとうございます!

お礼日時:2017/10/04 08:34

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


おすすめ情報