Bash:在循环中从STDIN读取的奇怪行为

时间:2013-05-15 18:17:24

标签: bash shell while-loop stdin

我观察到一种我不会动摇的行为,并希望有人对此有所了解。

我有两个脚本,都是从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

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

awk '{print $LINE}'

你的ctrl-D会把stdin完成到awk并带你回到while循环。