所以我在我的网络安全课上有一个项目来制作一个 bash 游戏。我喜欢制作一款中世纪的游戏,你可以在其中建造农场和矿山来获取资源。嗯,我喜欢做这样的东西。为此,我必须运行两个 while 循环。像这样
while [ blah ]; do
blah
done
while [ blah ]; do
blah
done
是否可以同时运行两个while循环,如果我写错了怎么写?
如果你&
在每个之后加上一个done
like done&
,你将在后台创建运行 while 循环的新进程。但是,您必须小心意识到这意味着什么,因为 bash 脚本将在创建这些新进程后继续执行命令,即使它们尚未完成。您可能会使用该wait
命令来防止这种情况发生,但我不太习惯使用它,所以我无法保证。
是的,但是您必须为要在其中执行的每个 while 循环分叉一个新进程。从技术上讲,它们不会同时运行(除非您考虑多个内核,但这甚至没有保证)。
下面是如何使用 bash 分叉多个进程的链接。
既然你提到这是一个学校项目,我就停在这里,以免我帮助你“不学习”。
R
首先,将循环包装成一个函数,然后分叉它。当您想要拆分一个进程时会这样做,例如,如果我正在处理一个包含 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
您还可以使用嵌套的 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
编辑:我以为您的意思是嵌套循环,但再次阅读您说“同时”运行两个循环。不过,我会在这里留下我的答案。