在bash中循环文件内容

时间:2013-01-11 11:56:40

标签: 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中的其他解决方案持开放态度。

2 个答案:

答案 0 :(得分:1)

要重复一遍,你可以:

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

是将输出'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中它将在子shell中,因此“$ A”仅在“do .... done;”中可用。区域,然后丢失!

要循环读取文件,也不要在子shell中执行此操作:

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

为了确保/ 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”&gt; / / file(-n,所以没有训练换行符)

答案 1 :(得分:0)

由于第一个循环,脚本挂起。完成第二个循环(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)