我有一个文件/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中的其他解决方案持开放态度。
答案 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)