【问题标题】:Bash: Odd behavior reading from STDIN in a loopBash:循环中从 STDIN 读取的奇怪行为
【发布时间】:2013-05-10 10:47:27
【问题描述】:

我观察到一种我无法理解的行为,并希望有人能对此有所了解。

我有两个脚本,都是从 STDIN 读取的。

从键盘读取一个数字序列(1输入2输入3输入...)

脚本 A 每次都打印“x”

#!/bin/bash

while read LINE 
do      
    echo "x"    # this happens everytime 
    echo $LINE  # this is the only different line
done

output:

1
x
1
2
x
2
3
x
3
4
x
4
5
x
5

脚本 B 仅在第一次读取 LINE 时打印“x”

#!/bin/bash

while read LINE 
do      
    echo "x"             # this happens only the first time
    awk '{print $LINE}'  # this is the only different line
done

output:

1
x
2
2
3
3
4
4
5
5

谁能解释一下?

【问题讨论】:

    标签: bash shell while-loop stdin


    【解决方案1】:

    awk 控制了您的标准输入。如果您在命令行中键入以下内容,您将看到会发生什么。

    awk '{print $LINE}'
    

    您的 ctrl-D 将完成 std​​in 到 awk 并带您回到 while 循环。

    【讨论】:

    • 很好的答案,我发誓我偶然发现了这个棘手的情况。对于初学者来说,这将是一个很好的考试题,哈哈。
    【解决方案2】:

    循环仍处于第一次迭代中。 awk 正在读取所有连续输入,而不是 read 命令。 awk 语句也没有打印 shell 变量 LINE 的值,因为它没有在单引号内展开。相反,awk 看到其内部变量 LINE 未定义,并将其视为值为 0。awk 然后打印 $0 的值,这是它从标准输入中读取的行。

    【讨论】:

    • 很好的答案,我发誓我偶然发现了这个棘手的情况。对于初学者来说,这将是一个很好的考试题,哈哈。
    猜你喜欢
    • 2012-08-17
    • 2019-02-05
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多