这可能是一个非常简单/愚蠢的问题,但我不明白为什么我在运行时没有得到预期值:
FOUND_FRONTDEV=false
echo "$PATHS" |
while IFS= read -r line
do
FOUND_FRONTDEV=true
echo "$FOUND_FRONTDEV"
break
done
echo "$FOUND_FRONTDEV"
返回“true”,然后返回“false”。它看起来像变量是本地的,但它不应该是。我真的很困惑为什么我的第二个回声打印错误。有人知道吗?
答案 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"