3

ですから、サイバーセキュリティクラスにbashゲームを作るプロジェクトがあります。私はあなたが資源を得るために農場や鉱山を作る中世のゲームの1つを作るのが好きです。そうですね、そういうものを作るのが好きです。そのためには、2つのwhileループを実行する必要があります。このような

while [ blah ]; do

    blah

done

while [ blah ]; do

    blah    

done

2つのwhileループを同時に実行することは可能ですか?間違って書いている場合、どうすれば書くことができますか?

4

4 に答える 4

9

のように、&それぞれの後にを置くと、whileループを実行する新しいプロセスがバックグラウンドで作成されます。ただし、bashスクリプトは、新しいプロセスを作成した後も、コマンドが終了していなくてもコマンドを実行し続けるため、これが何を意味するのかを注意深く理解する必要があります。これを防ぐためにコマンドを使用することもできますが、私はそれを使用することにあまり慣れていないため、保証することはできません。donedone&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 に答える