중첩된 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.

배경 스크립트 요소는 &하위 쉘(다른 쉘 프로세스)에서 실행되므로 쉘 변수에 대한 변경 사항은 한 방향이나 다른 방향에는 영향을 미치지 않습니다. (일반적으로 이는 부모 프로세스에 표시되지 않는 자식 프로세스의 변경 사항일 뿐입니다. 일반적으로 우리는 자식 프로세스가 완료될 때까지 기다리기 때문입니다.)

이것:

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

쉘이 자식 프로세스가 종료된 것을 확인하면 알림을 인쇄하고 자식 프로세스를 호출하여 이를 제거할 수 있습니다 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

관련 정보