杀死嵌套的 while 循环

杀死嵌套的 while 循环

我正在尝试创建一个基本循环,并且我想在循环父循环时退出嵌套循环。每次父循环时,嵌套循环都应重新启动。

#!/bin/bash

loop1=0
i=0

while [[ $loop1 -eq "0" ]]; do

    let "i+=1"
    echo $i "--------------"

    loop2=0
    j=0

    while [[ $loop2 -eq "0" ]]; do

        let "j+=1"
        echo $j $i
        sleep .2    

    done &

    loop2=1
    sleep 2

done

我想要的输出如下所示:

1 --------------
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
2 --------------
1 2
2 2
3 2
4 2
5 2
6 2
7 2
8 2
9 2
10 2

我得到了该输出,但原始的嵌套循环没有终止,所以我还得到 11 1、12 1、13 1 等等。

我确信这非常简单,但我不明白。

答案1

我不太确定这个练习的实际用途是什么,但为了杀死后台进程,我建议保存进程 ID,$!然后用kill.

后台脚本元素&在子 shell(一种不同的 shell 进程)中运行,因此对 shell 变量的更改不会在一个方向或另一个方向产生任何影响。 (通常这只是子进程中的更改未显示在父进程中,因为通常我们等待子进程完成。)

这:

#!/bin/bash

i=0
while true; do   # the loop runs forever, so just use 'true' here
    let "i+=1"
    echo $i "--------------"

    j=0
    while true; do   
        let "j+=1"
        echo $j $i
        sleep .2    
    done &

    pid=$!
    # disown   # remove the comment marker here
    sleep .5   # shorter timeout 
    kill $pid
done

印刷:

1 --------------
1 1
2 1
3 1
2 --------------
1 2
2 2
3 2
loop.sh: line 19:  4113 Terminated              while true; do
    let "j+=1"; echo $j $i; sleep .2;
done
3 --------------
1 3
2 3
...

当 shell 看到其子进程死亡时,它会打印出通知,我们可以通过 ing 子进程来摆脱它disown(从行中删除注释标记)。

答案2

评论中的某人让我了解了“jobs”命令,以及如何基于该命令终止进程。这就是我最终所做的。看起来最简单。

i=0
while true; do
    let "i+=1"
    echo $i "--------------"

    j=0
    while true; do
        let "j+=1"
        echo $j $i
        sleep .2    
    done &

    sleep 2

    # jobs
    kill %"$i"
done

相关内容