我想通过使用循环并行启动多个命令for
,每个命令可能需要或多或少的时间,并且我想在脚本末尾调用另一个命令。这是一个最小的例子:
#!/bin/bash
function test {
length=$1
sleep $length
echo "$length"
echo "-----"
}
# http://www.cyberciti.biz/faq/bash-for-loop-array/
array=( 5 1 3 )
for time in "${array[@]}"
do
test $time &
done
结果如下:
$ bash ~/test.sh && echo "OK"
OK
$ 1
-----
3
-----
5
-----
正如您所看到的,OK
在脚本结束之前显示,这是合乎逻辑的,因为我test
在后台调用了&
.我无法对最后一个test
调用添加测试,因为它可以在其他调用之前结束。我希望脚本仅test
在后台调用的所有实例结束后退出。
这是我试图获得的结果:
$ bash ~/test.sh && echo "OK"
1
-----
3
-----
5
-----
OK
$
我怎样才能得到这个输出?
答案1
你必须等待循环之后for
,因此等待所有当前活动的子进程:
for time in "${array[@]}"
do
test "$time" &
done
wait