是否可以同时运行两个循环?

时间:2012-12-02 00:24:14

标签: bash shell

所以我在网络安全课上有一个项目来制作一个bash游戏。我喜欢制作其中一个中世纪游戏,你可以在这里制作农场和地雷来获取资源。好吧,我喜欢做那样的事情。要做到这一点,我必须有两个while循环运行。喜欢这个

while [ blah ]; do

    blah

done

while [ blah ]; do

    blah    

done

是否可以同时运行两个while循环,如果我写错了怎么写呢?

4 个答案:

答案 0 :(得分:8)

如果您在每个&之后加done,例如done&,您将在后台创建运行while循环的新进程。您必须小心地意识到这意味着什么,因为bash脚本将在创建这些新进程后继续执行命令,即使它们没有完成。您可以使用wait命令来防止这种情况发生,但我不太习惯使用它,所以我无法保证它。

答案 1 :(得分:1)

是的,但是你必须为每个while循环执行一个新的进程。技术上,它们不会同时运行(除非你考虑多个核心,但这甚至没有被garaunteed)

下面是如何使用bash派生多个进程的链接。

Forking / Multi-Threaded Processes | Bash

既然你提到这是一个学校项目,我会在这里停下来,以免我帮你“不学习”。

[R

答案 2 :(得分:1)

首先,首先将循环包装到函数中然后分叉。 当您想要拆分流程时,例如,如果我正在处理具有160,000多行的 CSV ,单个流程/"线程"需要几个小时。如果你将循环包装成一个函数并简单地分叉它,你将运行x个进程,然后添加wait / kill defunct进程循环就完成了。在这里你在看什么。

  

while循环使用嵌套循环:

   function jobA() { 
       while read STR;
        do
            touch $1_temp
               key=$(IFS="|";set -- $STR; echo $1)                  
                for each in ${blah[@]};
                    do
                        #echo "$each"

                    done

        done <$1;
    }


  for i in ${blah[@]};  
            do 
            echo "$i"

            $(jobRDtemp $i) &

            child_pid=$!
            parent_pid=$$
            PIDS+=($child_pid)

            echo "forked process $child_pid with parent $parent_pid"
        done

            for pid in ${PIDS[@]};
                do
                    wait $pid
                done
                    echo "all jobs done"
                    sleep 1

现在这已被包装,这是FORKED循环的示例。这意味着您将在后台运行并行进程,WAIT将在继续之前等待ALL完成。这对某些类型的脚本很重要。

另外,请勿使用如上所示编写的C风格的嵌套FOR循环,例如:

for (( i = 1; i <= 5; i++ ))      ### Outer for loop ###
  

这非常慢。使用此类型:

for each in ${blah[@]};
                    do
                        #echo "$each"
                            if [ "$key" = "$each" ]; then
                                # echo  "less than $keyValNeed..."
                                echo $STR >> $1_temp
                            fi 
                    done

答案 3 :(得分:0)

您也可以使用嵌套for循环

for (( i = 1; i <= 5; i++ ))      ### Outer for loop ###
do

    for (( j = 1 ; j <= 5; j++ )) ### Inner for loop ###
    do
         echo -n "$i "
    done

    echo "" #### print the new line ###

done

编辑:我认为你的意思是嵌套循环,但再次读到你说“同时”运行两个循环。我会在这里留下我的答案。