bash:while循环中的boolean

时间:2013-04-03 21:00:20

标签: bash scripting

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

FOUND_FRONTDEV=false

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

echo "$FOUND_FRONTDEV"

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

由于你的管道,bash正在子shell中执行循环,因此它不会影响它之外的环境。您可以通过将echo | while ...更改为while ... done <<<$PATHS

来解决此问题

答案 2 :(得分:4)

您必须更改while循环,以便echo部分在子shell中运行,而不是在while循环中运行。当变量在子shell中更改时,它只会在那里更改,而不会在父shell的上下文中更改。

所以试试:

FOUND_FRONTDEV=false

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

echo "$FOUND_FRONTDEV"