【问题标题】:bash: boolean in while loopbash:while循环中的布尔值
【发布时间】:2013-04-04 05:14:30
【问题描述】:

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

FOUND_FRONTDEV=false

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

echo "$FOUND_FRONTDEV"

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

【问题讨论】:

    标签: bash scripting


    【解决方案1】:

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

    【讨论】:

    • 谢谢!这太愚蠢了:)非常感谢!我修改了我的循环以不管道回声:) 完美!谢谢。
    【解决方案2】:

    因为你的管道,bash 在一个子shell 中执行循环,所以它不会影响它外面的环境。您可以通过将echo | while ... 更改为while ... done <<<$PATHS 来解决此问题

    【讨论】:

      【解决方案3】:

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

      那就试试吧:

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

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 2017-11-04
        • 1970-01-01
        • 2011-08-01
        • 2018-12-13
        • 2019-01-19
        • 2020-12-03
        • 2017-11-20
        • 2017-09-11
        相关资源
        最近更新 更多