Mate um loop aninhado

0

Estou tentando fazer um loop básico e quero sair do loop aninhado quando faço o loop do pai. O loop aninhado deve reiniciar sempre que o pai faz um loop.

#!/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

Meu resultado desejado ficaria assim:

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

Estou obtendo essa saída, mais ou menos, mas o loop aninhado original não termina, portanto, também recebo 11 1, 12 1, 13 1 e assim por diante.

Tenho certeza de que isso é muito simples, mas não entendi.

    
por Adam Nerland 15.01.2018 / 04:47

2 respostas

1

Eu não sei exatamente qual é o uso prático deste exercício, mas para matar os processos em segundo plano, eu recomendo salvar o ID do processo de $! e depois gravá-lo com kill .

O elemento de script em background com & é executado em um subshell, um processo de shell distinto, de modo que nenhuma alteração nas variáveis do shell produz efeito, em um sentido ou no outro. (Geralmente, isso só acontece com mudanças na criança que não aparecem no pai, já que geralmente esperamos que o processo filho seja concluído.)

Isto:

#!/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

impressões:

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
...

O shell imprime avisos quando vê seus processos filhos morrendo, podemos nos livrar disso por disown ing o filho (remova o marcador de comentário da linha).

    
por 15.01.2018 / 13:55
0

Alguém nos comentários me colocou no comando "jobs" e como matar um processo baseado nisso. Então é isso que acabei fazendo. Parecia o mais simples.

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
    
por 16.01.2018 / 15:08