5

我试图避免创建任何新文件来存储输出,以尽量减少覆盖同名目录中某些内容的风险。我试图用管道评估流中的每一行,而不是输出到文件然后使用while read line do done < file循环。就像是:

echo -e "1\n2\n3\n4\n5" | #evaluate current line separately#

我可以以某种方式将每一行读入一个数组,然后评估数组中的元素吗?还是有更好的方法来避免意外覆盖文件?

4

3 回答 3

10

bash中,常用的方法是使用 Process Substitution:

while read line ; do
    ...
done < <( commands producing the input)
于 2012-08-03T08:59:11.527 回答
4

你已经到了一半...

echo -e "1\n2\n3\n4\n5" | while read line; do
    ...
done

请注意,bash 在单独的进程中运行管道的每个部分,并且在那里定义的任何变量都不会在该块之后持续存在。(ksh93 将保留它们,因为循环将在当前 shell 进程中运行。)

于 2012-08-03T09:08:42.647 回答
1

mktemp您可以通过使用或tempfile创建具有唯一名称的临时文件来避免覆盖文件。但是,我会在 choroba 的回答中使用流程替换。

于 2012-08-03T09:13:20.933 回答