【问题标题】:weird behaviour with nested loops in bashbash中嵌套循环的奇怪行为
【发布时间】:2013-05-24 00:24:06
【问题描述】:

我想知道为什么这个 bash 脚本

#!/bin/bash
seq 1 3 > foo
COUNT=0
while read VAR1; do
    while read VAR2; do
        let COUNT++
        echo -n $COUNT
    done < foo
done < foo

输出:123456789

虽然这个其他 bash 脚本(AFAIK)应该做同样的事情

#!/bin/bash

seq 1 3 > foo

COUNT=0
while read VAR1; do
    cat foo | while read VAR2; do
        let COUNT++
        echo $COUNT
    done
done < foo

输出:123123123

【问题讨论】:

    标签: bash loops while-loop nested io-redirection


    【解决方案1】:

    不同之处在于管道在子外壳中运行。因此,在第二种情况下,在内循环结束后,对 COUNT 变量的更改不会持续存在。

    【讨论】:

      【解决方案2】:

      使用| 调用子shell,因此您的变量在其中没有任何值。

      快速查看调试日志将解释该场景。以bash -x scriptname 运行这两个脚本,您应该自己回答。

      【讨论】:

      • 子shell 维护父shell 的变量,但具有相同的值。这不是真的,它们没有任何价值。
      • @blue 正确。我不是故意写那个的。我应该说,在内循环中对变量所做的增量在循环完成后并不成立。
      【解决方案3】:

      在第二个示例中,内部循环位于管道中。因此,它在子shell中执行,因此对变量 COUNT 的更改是内部循环的局部变量。

      【讨论】:

        【解决方案4】:

        你的cat foo | ... 对我来说看起来很可疑。基本上,我认为您会一次又一次地获取文件 foo,而无需进入 VAR2 while 循环。

        【讨论】:

        • 这确实有效:cat foo | while read VAR; do echo $VAR; done
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-16
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        • 1970-01-01
        相关资源
        最近更新 更多