Bash 循环到文件的输出

Bash 循环到文件的输出,bash,shell,Bash,Shell,我试图让for循环将文本输出到文件10次。以下是我所拥有的: for ((i=1;i<=10;i++)); do echo "Hello World" >testforloop.txt done ((i=1;itestforloop.txt)的 完成 这会将Hello World一次输出到文件testforloop.txt。如果我不输出到文件,它会将Hello World打印到屏幕上10次。您只是用“>”重定向回显,因此它会覆盖。您需要的是使用“>>”

我试图让for循环将文本输出到文件10次。以下是我所拥有的:

for ((i=1;i<=10;i++)); do
    echo "Hello World" >testforloop.txt
done
((i=1;itestforloop.txt)的

完成

这会将
Hello World
一次输出到文件
testforloop.txt
。如果我不输出到文件,它会将
Hello World
打印到屏幕上10次。

您只是用“>”重定向回显,因此它会覆盖。您需要的是使用“>>”操作符进行附加。执行以下操作:

       for ((i=1;i<=10;i++)) ; do echo "Hello World" >> testforloop.txt ;  done
for((i=1;i>testforloop.txt;完成

您使用的是
重定向,它会清除文件中的现有内容,并在循环内用命令的输出替换它。因此,这会清除以前的内容10次,每次用一行替换

如果没有
,或使用
/dev/tty
,它将进入您的显示器,在那里
无法擦除任何内容,因此您可以看到所有十份副本

您可以使用
>
,它仍然会打开文件十次,但每次都会追加(而不是删除以前的内容)。但这不是非常有效,而且它会保留以前运行的数据(这可能是您想要的,也可能不是您想要的)

或者,您可以重定向整个循环一次:

for ... do cmd; done >file

它在输出重定向的情况下运行整个循环,只创建一次(或者,使用
>
,打开以进行追加)。

您重写testforloop.txt十次。如果您这样做

for((i=1;i testforloop(i).txt;完成


其中i是for循环中的int。我不确定您使用的编程语言。

以下内容将解决您的问题:

您应该尝试使用
>
操作符,原因已经在命令
echo-e

使用选项“\n”-带退格解释程序“-e”的新行 从使用它的地方开始的新线

这样做:

for((i=1;i>testforloop.txt;完成)

cat命令:

cat testforloop.txt

输出:


你好,世界
你好,世界
你好,世界
你好,世界
你好,世界
你好,世界
你好,世界
你好,世界
你好,世界
你好,世界

或者,您可以尝试:

cat-n testforloop.txt

输出:


1你好,世界
2你好,世界
3你好,世界
4你好,世界
5你好,世界
6你好,世界
7你好,世界
8你好,世界
9你好,世界
10你好,世界

这没关系,但正如@torek所指出的,一次写作比多次追加要好。@kojiro是的,他的观点是正确和有效的。但是,提问者在获取“重定向”和“追加”时遇到了问题是的。但这不仅仅是在文件中追加10次。它是在打开文件进行追加10次。所以我认为指出区别仍然非常重要。听着,我并不反对torek的观点,我也给了+1,但你需要理解,当有人在获取“>”和“>>”时是的,当然他没有考虑让语句高效,他在学习,所以他知道“>”和“>>”都是关于什么也很重要,在他清楚了概念之后,他就可以让事情高效。我认为在学习编程之前,你还没有学过高效的编码;-)-1他正在用
bash
编程。这个答案也很难理解,因为(撇开语法问题不谈)它似乎只是重复了这个问题。也许还需要注意的是,
…done>file
更有效(有时非常有效)因为只需打开、缓冲、写入和关闭文件一次。@tripleee:缓冲和写入是命令的内部操作(除非它是内置的shell)。不过,打开是一个相对缓慢的操作,所以这是“更高效”的原因。此处不适用的主要缺点是,循环中的所有命令都将其输出重定向,因此,如果您只需要一些命令,则必须执行其他操作。但是,一次打开、写入和关闭一行实际上会禁用任何缓冲,而单次重定向允许进行缓冲,尽管PERPAP不在循环中这是一个特殊的例子。@tripleee:实际上,在这个例子中,它是一个内置的shell。我还没有深入研究bash的内部,所以我不确定它是否有多大帮助(shell通常需要进行大量的刷新,因此,它们很难在内部实现正确和高效)。