[英]Looping file contents in bash
我有一個文件 /tmp/a.txt ,我想多次讀取它的內容。 如果達到 EOF,那么它應該從頭開始。
即如果文件的內容是“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 中的其他解決方案持開放態度。
要一遍又一遍地重復一行,您可以:
yes "abc" | for i in {1..3}; do read -N 10 A; echo "for $i: $A"; done
yes 將輸出 'forever',但是 1..3 中的 for i 將只執行“do ... done;” 第 3 部分
是的,在字符串后添加一個“\\n”。 如果您不想要它,請執行以下操作:
yes "abc" | tr -d '\n' | for i in {1..3}; do read -N 10 A; echo "for $i: $A"; done
在上述所有內容中,請注意,由於讀取是在管道之后,因此在 bash 中它將位於子外殼中,因此“$A”僅在“do....done;”中可用。 區域,然后迷路!
要循環並從文件中讀取,也不要在子 shell 中執行此操作:
for i in {1..3}; do read -N 10 A ; echo "for $i: $A"; done <$(cat /the/file)
為確保 /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, 所以沒有訓練換行符)
由於第一個循環,腳本掛起。 在第二個循環 (for) 的三個迭代完成后,第一個循環重復啟動新的cat
實例,這些實例讀取文件,然后將內容abc
寫入管道。 在以后的迭代中,對管道的寫入不再起作用。 是的,有一個 SIGPIPE 終止,但是針對cat
命令而不是循環本身。 所以解決方案是在正確的地方捕捉錯誤:
while [ 1 ];
do cat /tmp/a.txt || break
done |
for i in {1..3};
do read -N 10 A;
echo "For $i: $A";
done
此外:輸出如下:
For 1: abcabcabca
For 2: bcabcabcab
For 3: cabcabcabc
<-- (Here the shell hangs no more)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.