0

这可能是一个非常简单/愚蠢的问题,但我不明白为什么我在运行它时没有得到预期值:

FOUND_FRONTDEV=false

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

echo "$FOUND_FRONTDEV"

它返回“真”然后“假”。看起来变量是本地的,但它不应该是。我真的很困惑为什么我的第二个回声打印错误。请问有人知道吗?

4

3 回答 3

4

You have to change the while loop so that the echo part is run in a subshell and not the while loop itself. When the variable is changed in a subshell it is only changed there and not changed within the context of the parent shell.

So try:

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 在子shell 中执行循环,因此它不会影响其外部的环境。您可以通过更改echo | while ...来解决此问题while ... done <<<$PATHS

于 2013-04-03T21:12:31.407 回答
4

while 循环部分在子shell 中执行。因此,您所做的更改FOUND_FRONTDEV在父 shell 中不可见,因为FOUND_FRONTDEV一旦子 shell 退出,while 循环内部就会消失。

于 2013-04-03T21:10:48.213 回答