2013-04-03 52 views
0

这可能是一个非常简单的/愚蠢的问题,但我不理解为什么我没有得到预期的值,当我运行此:庆典:布尔在while循环

FOUND_FRONTDEV=false 

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

echo "$FOUND_FRONTDEV" 

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

回答

4

while循环部分在子外壳中执行。因此,您对​​所做的更改在父shell中不可见,因为while循环内的​​将在子shell退出后死亡。

+0

谢谢!这太蠢了:)非常感谢你!我修改了我的循环,以防止回声:)完美!谢谢。 – user1777907 2013-04-03 21:15:23

4

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

4

您必须更改while循环,以便echo零件在子外壳中运行,而不是在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"