手动迭代文件的一行| 庆典

Gre*_*reg 8 iteration bash shell loops

我可以用任何其他语言做到这一点,但是对于Bash,我看起来远远不够,无法找到答案.

我需要手动增加$line脚本.例:

for line in `cat file`
do
foo()
       foo_loop(condition)
{
 do_something_to_line($line) 
}
done
Run Code Online (Sandbox Code Playgroud)

如果你注意到,每次foo_loop迭代时都$line保持不变.我需要在$line那里迭代,并确保原始for循环只运行文件中的行数.

我已经考虑过使用不同的循环查找文件中的行数并在内部循环中迭代行变量foo().

有任何想法吗?

编辑:

很抱歉这么模糊.

开始了:

我试图让我的代码的一部分执行多次(并行执行)

Function foo() # Does something
for line in `cat $temp_file`;
foo($line)
Run Code Online (Sandbox Code Playgroud)

该代码工作正常,因为foo它只是接受行的值; 如果我想这样做:

Function foo() # Does something
for line in `cat $temp_file`;
while (some condition)
foo($line)
end
Run Code Online (Sandbox Code Playgroud)

$line将在整个while循环中等于相同的值.我需要它随while循环改变,然后在它返回时继续for.例:

line = Hi
foo{ echo "$line" }; 
for line in `cat file`;
while ( number_of_processes_running -lt max_number_allowed)
foo($line)
end
Run Code Online (Sandbox Code Playgroud)

如果文件的内容是

Hi \n Bye \n Yellow \n Green \n
Run Code Online (Sandbox Code Playgroud)

示例程序的输出将是(如果允许的最大数量为3)

Hi Hi Hi Bye Bye Bye Yellow Yellow Yellow Green Green Green.
Run Code Online (Sandbox Code Playgroud)

我希望它在哪里

Hi Bye Yellow Green 
Run Code Online (Sandbox Code Playgroud)

我希望这更好.我正在尽力解释我的问题.

Bug*_*ill 16

而不是使用for循环来读取文件,你应该像这样读取文件.

#!bin/bash

while read line
do
    do_something_to_line($line)
done < "your.file"
Run Code Online (Sandbox Code Playgroud)


Ste*_*ven 6

长话短说, while read line; do _____ ; done

然后,确保在"$ line"周围有双引号,以便参数不会被空格分隔.

例:

$ cat /proc/cpuinfo | md5sum
c2eb5696e59948852f66a82993016e5a *-

$ cat /proc/cpuinfo | while read line; do echo "$line"; done | md5sum
c2eb5696e59948852f66a82993016e5a *-
Run Code Online (Sandbox Code Playgroud)

第二个示例#将.gz添加到当前目录中的每个文件:#如果任何文件有空格,该行的mv命令将返回错误.

$ find -type f -maxdepth 1 | while read line; do mv "$line" "$line.gz"; done
Run Code Online (Sandbox Code Playgroud)