2013-01-11 121 views
0

我有一個文件/tmp/a.txt,其內容我想在變量中讀取很多次。如果達到EOF,則應從頭開始。在bash中循環文件內容

即如果文件的內容是「abc」,我想得到10個字符,它應該是「abcabcabca」。

爲此,我寫了一個明顯的腳本:

while [ 1 ]; 
    do cat /tmp/a.txt; 
done | 
for i in {1..3}; 
    do read -N 10 A; 
    echo "For $i: $A"; 
done 

唯一的問題是,它掛!我不知道爲什麼它這樣做!

我也對bash中的其他解決方案開放。

+0

它掛起,因爲你只要求它做3次(1..3)a在/tmp/a.txt的輸出上讀「-N 10 A」。 你想做什麼? –

+0

'cat file file file file ...> newfile'將複製文件內容。以及如果你需要複製文件1m次,貓不會工作。你到底在做什麼? – Kent

+0

while循環和for循環都是管道,所以while的輸出傳遞給for。由於for循環退出3次迭代後,我假設while循環應該得到像SIGPIPE和退出。但事實並非如此。輸出來了,然後它掛在那裏。 – binit

回答

1

要重複一遍又一遍線路,您可以:

yes "abc" | for i in {1..3}; do read -N 10 A; echo "for $i: $A"; done 

是將輸出「永遠」,但後來因爲我在1..3將只執行了「不...做;」 part 3 times

是在字符串後面加一個「\ n」。如果你不想要的話,做的事:

yes "abc" | tr -d '\n' | for i in {1..3}; do read -N 10 A; echo "for $i: $A"; done 

在上述所有的,請注意,讀是管後,在bash這將是一個子shell,所以「$ A」將只適用於「做......完成」;區域,並在之後失去!從文件中讀取

要循環和,也沒有這樣做,在一個子shell:

for i in {1..3}; do read -N 10 A ; echo "for $i: $A"; done <$(cat /the/file) 

可以肯定的存在/的/文件足夠的數據,重複隨意:

for i in {1..3}; do read -N 10 A ; echo "for $i: $A"; done <$(cat /the/file /the/file /the/file) 

要測試最新的:echo -n「abc」>/the/file(-n,所以沒有訓練換行符)

+0

我想使用文件的內容(並且文件非常大)而不是硬編碼字符串。是的,還增加了我不想要的尾隨換行符。 – binit