簡體   English   中英

在bash中循環文件內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM