繁体   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