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