Может, так лучше?
finished=
func() {
<что-то>
finished=1
}
func &
for 1 2 3 4 5; do
sleep 1
if [ -n "$finished" ]; then
wait
break
fi
done
if [ -z "$finished" ]; then
echo killing func >&2
kill $!
wait
fi
--
С уважением, Епифанов Сергей