2016-04-06 69 views
1

我試圖瞭解環文件重定向的外殼是如何工作的,所以我寫了下面的代碼:文件重定向在外殼環

#!/bin/sh 
while IFS='' read -r line; do 
    echo 'reading '$line 
    awk -F, '{sub(/.*/,"Completed",$2);print}' 
done<$1 

我給下面的輸入文件腳本:

hello,hi,how are you 
i,am,good 

上述文件運行腳本的輸出是:

reading hello,hi,how are you 
i Completed good 

我はs預期輸出的形式:

reading hello,hi,how are you 
hello,Completed,how are you 
i Completed good 
reading i,am,good 
hello,Completed,how are you 
i Completed good 

爲什麼循環不打印「閱讀」的兩條線?而且,爲什麼awk的替換不會在第一行發生?任何人都可以請解釋腳本的輸出嗎?

+5

您的'awk'命令將從標準輸入中讀取,在這種情況下是$ 1的重定向:所以'read'讀取$ 1'的第一行,然後'awk'讀取剩餘的行。也許你想'awk -F'{sub(/.*/,「Completed」,$ 2); print}'<<<「$ line」'將'$ line'的內容發送到'awk'。 –

+1

爲什麼這個評論不是答案? :) – Dominik

+0

閱讀http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice –

回答

1

只有一個stdin您在循環中重定向。 readawk都將從stdin中讀取。雖然read只消耗一行(第一個),但awk愉快地消耗其餘的。

在下一次迭代中,read沒有更多內容可讀,並且循環終止。

如果你想提供awk的標準輸入數據,你必須明確地這樣做,例如,通過與printf '%s\n' "$line" | awk ...管道進入awk