为什么要 bash read 命令创建循环局部变量?[复制]

why bash read command create a loop-local variable? [duplicate]

提问人:PeopleMoutainPeopleSea 提问时间:2/18/2023 最后编辑:CyrusPeopleMoutainPeopleSea 更新时间:4/24/2023 访问量:87

问:

我写了以下 bash 脚本。read 命令创建变量 。 如果则中断循环。var$var==5

    seq 10 | while read -r var
    do
      echo "read: $var"
      if [[ $var == 5 ]]; then
        echo "break loop: $var"
        break
      fi
    done
    
    echo "after loop: $var"

这是输出

read: 1
read: 2
read: 3
read: 4
read: 5
break loop: 5
after loop: 

我的问题是:为什么在循环之后,是空的?$var

bash 管道 子外壳

答:

2赞 Joseph Sible-Reinstate Monica 2/18/2023 #1

该变量不是循环局部的,与此处的循环相关的所有内容都只是红鲱鱼。您看到的行为是因为管道启动了子壳。如果摆脱管道并改为运行以下代码:read

    while read -r var
    do
      echo "read: $var"
      if [[ $var == 5 ]]; then
        echo "break loop: $var"
        break
      fi
    done < <(seq 10)
    
    echo "after loop: $var"

然后它将打印以下内容:

read: 1
read: 2
read: 3
read: 4
read: 5
break loop: 5
after loop: 5

评论

1赞 Philippe 2/18/2023
另一种选择是运行shopt -s lastpipe