2014-02-07 129 views
0

考慮我有內容可用文件中它Unix的讀命令的行爲在文件輸入重定向

cat file | read; echo $REPLY 

給空輸出

read < file; echo $REPLY 

給出了文件的第一行作爲結果

while IFS= read; do :; done < file; echo $REPLY 

什麼都不打印,空輸出。我在這裏預期文件的最後一行作爲輸出,因爲我認爲迭代將發生到文件末尾,並且最後一行將保留在REPLY變量中。這種行爲的任何理由?

回答

1
while IFS= read; do :; done < file; echo $REPLY 

上面逐個讀取文件的每一行。在它讀取文件的最後一行之後,它會經歷循環,然後它會嘗試再次讀取。這是讀取的最後一次嘗試,它會生成文件結束條件和空的$ REPLY。

read < file; echo $REPLY 

默認情況下,read一次讀取一行。您只需要一條線,這就是$ REPLY中的內容。 (如果一個指定-d選項read,然後$ REPLY可以根據選擇的分隔符有它的整個文件。

cat file | read; echo $REPLY 

這是一個管道,這意味着read是在子shell。因此,殼它創建變量沒有生存

如果你的目標是讓該文件的最後一行到一個變量,有選擇,例如:。

reply="$(tail -n1 file)" ; echo $reply 

或者,

reply="$(sed -n '$p' file)" ; echo $reply 

(在sed發言,$表示文件的最後一行,並p表示打印。所以,$p手段打印文件的最後一行)

0

如果你想使用while loop使用這種從文件的最後一行保持REPLY變量:

REPLY= 
while read -r line; do 
    REPLY="$line" 
done < file 

echo "REPLY=$REPLY" 
相關問題