2013-05-15 49 views
3

我觀察到一種行爲,我並沒有失去理智,並希望有人對此有所瞭解。Bash:在循環中從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打印的 「x」 僅在第一次它讀LINE

#!/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 

有人可以解釋這一點嗎?

回答

3

該循環仍處於第一次迭代中。 awk正在讀取所有連續的輸入,而不是read命令。 awk聲明也沒有打印shell變量的值LINE,因爲它沒有在單引號內展開。相反,awk發現其內部變量LINE未定義,並將其視爲值爲0. awk然後輸出$0的值,即從標準輸入中讀取的行。

+0

偉大的答案,我發誓我發現這種棘手的情況,意外。這對初學者來說會是一個很好的考試問題,哈哈。 –

2

awk控制了你的標準輸入。如果你在命令行輸入以下內容,你會看到會發生什麼。

awk '{print $LINE}' 

您的ctrl-D將完成stdin到awk並帶您回到while循環。

+0

很好的答案,我發誓我偶然發現了這種棘手的情況。這對初學者來說會是一個很好的考試問題,哈哈。 –