3

所以我在我的网络安全课上有一个项目来制作一个 bash 游戏。我喜欢制作一款中世纪的游戏,你可以在其中建造农场和矿山来获取资源。嗯,我喜欢做这样的东西。为此,我必须运行两个 while 循环。像这样

while [ blah ]; do

    blah

done

while [ blah ]; do

    blah    

done

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

4

4 回答 4

9

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

于 2012-12-02T00:36:21.907 回答
1

是的,但是您必须为要在其中执行的每个 while 循环分叉一个新进程。从技术上讲,它们不会同时运行(除非您考虑多个内核,但这甚至没有保证)。

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

分叉/多线程进程 | 重击

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

R

于 2012-12-02T00:30:32.090 回答
1

首先,将循环包装成一个函数,然后分叉它。当您想要拆分一个进程时会这样做,例如,如果我正在处理一个包含 160,000 多行的CSV,那么单个进程/“线程”将需要几个小时。如果您将循环包装到一个函数中并简单地分叉它,您将运行 x 数量的进程,然后添加等待/杀死已失效的进程循环,您就完成了。你在看什么。

带有嵌套循环的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
于 2017-02-01T18:08:58.160 回答
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

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

于 2012-12-02T00:31:57.077 回答