阅读' n'来自文件的行,并使用Shell脚本进行迭代

时间:2014-10-16 16:43:03

标签: shell batch-processing

我有一个包含300行的员工档案。现在我正在读取其中的所有行并调用子进程来处理。但是我需要一次读取20行并为其调用SubProcess并迭代直到它完成所有300行?

while read -r name age empno ; do
    echo $EmpName $EmpAge $EmpNumber
    ./run.sh RUN_EMP -a $EmpName -b $EmpAge -c $EmpNumber &  
   done < "$File_Employee" >  /logs/Emp_`date +%Y%m%d%H%M`.log
   wait

Shell Scripting中有一个选项来限制要读取的行数吗?

如果我需要在任何给定时间运行20个进程;我的下面的方法是否正常?当我尝试执行此过程时,该过程将运行前20个作业并优雅地存在。

    while read -r empname empage empnumber ; do
    echo $empname $empage $empnumber
        while [[ $( jobs | wc -l ) -ge 20 ]]
      do
        echo going to sleep now at $(date)
        sleep 3
          done
    ./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
      done <"$File_Employee" >Emp_`date +%Y%m%d%H%M`.log
wait

2 个答案:

答案 0 :(得分:1)

bash脚本计算创建的./run.sh个进程的数量,每20个进程计数,它会停止并在开始更多之前等待它们完成:

#!/bin/bash
count=0
while read -r empname empage empnumber ; do
    echo $empname $empage $empnumber
    ./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
    ((++count % 20 == 0 )) && wait
done <"$File_Employee" >/logs/Emp_`date +%Y%m%d%H%M`.log

这里的关键变化是这一行:

((++count % 20 == 0 )) && wait

此行将计数递增1,然后检查count是否为20的倍数。如果是,则调用等待后台进程的bash内置wait完成。

POSIX

以下内容适用于任何POSIX shell:

File_Employee=employees
count=0
while read -r empname empage empnumber ; do
    echo $empname $empage $empnumber
    ./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
    count=$((count+1))
    [ 0 -eq $((count % 20)) ] && wait
done <"$File_Employee" >Emp_`date +%Y%m%d%H%M`.log

答案 1 :(得分:0)

你可以这样做

end=0
while [ $end -eq 0 ]; do
    for (( i=0 ; $i < 20 ; i++ )) do
        read -r name age empno || {
            end=1
            break
        }
        # do something with it
    done
    # do something with the group
done

还有其他类似的形式。请注意,您可能需要为输入不均匀分成20行组的可能性做好准备。示例代码尽可能地处理,但“做某事”部分可能需要自己的调整。