3

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

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

有人可以解释一下吗?

4

2 回答 2

3

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

于 2013-05-15T18:21:56.010 回答
2

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

awk '{print $LINE}'

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

于 2013-05-15T18:23:19.257 回答