0

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

4

2 回答 2

1

要一遍又一遍地重复一行,您可以:

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 中它将位于子 shell 中,因此“$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, 所以没有训练换行符)

于 2013-01-11T12:11:17.790 回答
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)
于 2020-04-02T18:40:29.397 回答