【问题标题】:Output for loop to a file循环输出到文件
【发布时间】:2013-09-12 04:11:07
【问题描述】:

我正在尝试让 for 循环将文本输出到文件 10 次。这是我所拥有的:

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

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

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    您正在使用&gt; 重定向,它会清除文件的现有内容并将其替换为循环内的命令输出。所以这会清除之前的内容 10 次,每次替换为一行。

    没有&gt;&gt;/dev/tty,它会显示在您的显示器上,&gt; 无法擦除任何内容,因此您会看到所有十个副本。

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

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

    for ... do cmd; done >file
    

    它运行整个循环并重定向输出,只创建一次(或使用&gt;&gt;,打开追加)。

    【讨论】:

    • 也许还要注意... done &gt;file 效率更高(有时非常高效),因为您只需打开、缓冲、写入和关闭文件一次。
    • @tripleee:缓冲和写入是命令内部的(除非它是内置的 shell)。不过,Open 是一个相对较慢的操作,所以这就是“更有效”的原因。主要缺点(此处不适用)是循环内的 所有 命令的输出重定向,因此如果您只想要一些,则必须执行其他操作。
    • 但是一次打开、写入和关闭一行会有效地禁用任何缓冲,而单个重定向允许进行缓冲,尽管在这种特殊情况下不会发生这种情况。
    • @tripleee:实际上,在这种情况下,它内置的shell。我还没有深入研究 bash 的内部结构,所以我不确定它是否有多大帮助(shell 往往必须进行大量冲洗等,它们很难在内部同时正确和高效)。
    【解决方案2】:

    你只是用“>”重定向回声,所以它会覆盖。您需要的是使用“>>”运算符附加。执行以下操作:

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

    【讨论】:

    • 这没关系,但正如@torek 指出的那样,写一次总比追加多次好。
    • @kojiro 是的,他的观点是正确和有效的。但是,提问者在正确“重定向”和“追加”时遇到问题。
    • 但这不仅仅是追加到文件10次。它打开文件进行追加 10 次。所以我认为指出差异仍然非常重要。
    • 看,我没有不同意 torek 的观点,我也为此给了 +1,但你需要理解,当有人在获取“>”和“>>”时遇到问题,当然他是不考虑让语句高效,他在学习,所以他知道“>”和“>>”是什么也是重要,在他清楚概念之后,他就可以去做事情了高效的。我认为你在学习编程之前还没有学习高效的编码;-)
    【解决方案3】:

    以下将解决您的问题:

    您应该尝试使用&gt;&gt; 运算符,原因已在命令echo -e 中提到

    使用选项‘\n’ - 使用退格解​​释器‘-e’处理的新行 使用它的新行。

    link

    这样做:

    for ((i=1;i&lt;=10;i++)) ; do echo -e "Hello World" &gt;&gt; testforloop.txt ; done

    cat 命令:

    cat testforloop.txt

    输出:

    Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World

    或者,您可以尝试:

    cat -n testforloop.txt

    输出:

    1 Hello World 2 Hello World 3 Hello World 4 Hello World 5 Hello World 6 Hello World 7 Hello World 8 Hello World 9 Hello World 10 Hello World

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • -1 他在bash 编程。这个答案也很难理解,因为(除了语法问题)它似乎只是重复了这个问题。
      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2022-11-28
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多