0

これはおそらく非常に単純で愚かな質問ですが、これを実行しても期待値が得られない理由がわかりません。

FOUND_FRONTDEV=false

echo "$PATHS" |
  while IFS= read -r line
do
    FOUND_FRONTDEV=true
    echo "$FOUND_FRONTDEV"
    break
done

echo "$FOUND_FRONTDEV"

「true」の次に「false」を返します。変数がローカルのように見えますが、そうではありません。なぜ私の 2 番目のエコーが false を出力するのか、私は本当に混乱しています。誰か教えてください。

4

3 に答える 3

4

while ループ部分はサブシェルで実行されます。したがって、サブシェルが終了すると while ループFOUND_FRONTDEVの内側が死ぬため、変更は親シェルには表示されません。FOUND_FRONTDEV

于 2013-04-03T21:10:48.213 に答える
4

echowhile ループ自体ではなく、部分がサブシェルで実行されるように、while ループを変更する必要があります。変数がサブシェルで変更されると、そこでのみ変更され、親シェルのコンテキスト内では変更されません。

だから試してください:

FOUND_FRONTDEV=false

while IFS= read -r line ; do
    FOUND_FRONTDEV=true
    echo "$FOUND_FRONTDEV"
    break
done < <(echo "$PATHS")

echo "$FOUND_FRONTDEV"
于 2013-04-03T21:14:30.963 に答える
4

パイプのため、bash はサブシェルでループを実行しているため、外部の環境に影響を与えることはできません。echo | while ...に変更することでこれを回避できますwhile ... done <<<$PATHS

于 2013-04-03T21:12:31.407 に答える