所以我在网络安全课上有一个项目来制作一个bash游戏。我喜欢制作其中一个中世纪游戏,你可以在这里制作农场和地雷来获取资源。好吧,我喜欢做那样的事情。要做到这一点,我必须有两个while循环运行。喜欢这个
while [ blah ]; do
blah
done
while [ blah ]; do
blah
done
是否可以同时运行两个while循环,如果我写错了怎么写呢?
答案 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
编辑:我认为你的意思是嵌套循环,但再次读到你说“同时”运行两个循环。我会在这里留下我的答案。