중첩된 While 루프가 예상대로 작동하지 않습니다.

중첩된 While 루프가 예상대로 작동하지 않습니다.

나는 다음 스크립트를 작성했습니다.

CODE=`cut -c 7-21 Data.txt`

for i in ${CODE};
do
    WIN=2
    PER=50
    if [ -f ../FASTA_SEC/${i}.fa ]
    then
        while [[ ${WIN} -lt 20 ]]
        do 
            echo "The value of WIN is" $WIN "now begins nested while"
            while [[ ${PER} -lt 100 ]]
            do      
                echo "value of PER is" $PER             
                ((PER=$PER+2))
            done
            ((WIN=$WIN+2))
        done

    else
        echo "the file does not exist" ${i}
    fi
done

나는 이것이 다음과 같이 작동할 것으로 기대합니다:

$WIN $PER
2    50
2    52
2    54
2    56
[.....]
4    50 
4    52
4    54
4    56

등등.. 중첩된 while을 사용하여 이 작업을 수행할 수 있지만 다음과 같은 결과를 얻습니다.

The value of WIN is 2 now begins nested while
value of PER is 50
value of PER is 52
value of PER is 54
value of PER is 56
value of PER is 58
value of PER is 60
value of PER is 62
value of PER is 64
value of PER is 66
value of PER is 68
value of PER is 70
value of PER is 72
value of PER is 74
value of PER is 76
value of PER is 78
value of PER is 80
value of PER is 82
value of PER is 84
value of PER is 86
value of PER is 88
value of PER is 90
value of PER is 92
value of PER is 94
value of PER is 96
value of PER is 98
The value of WIN is 4 now begins nested while
The value of WIN is 6 now begins nested while
The value of WIN is 8 now begins nested while
The value of WIN is 10 now begins nested while
The value of WIN is 12 now begins nested while
The value of WIN is 14 now begins nested while
The value of WIN is 16 now begins nested while
The value of WIN is 18 now begins nested while

WIN 값이 2이면 내부 루프가 한 번만 실행된 후 Win 값을 씁니다. 예상대로 작동하지 않는 이유는 무엇입니까?

변수를 2씩 증가하는 범위로 정의하려면 어떻게 해야 합니까? 예를 들어 $PER=(Range 50:100, 2)는 이 범위를 다음으로 통합합니다.for i in $PER loop

어떤 제안이 있나요?

감사해요

답변1

$PER외부 루프가 반복될 때마다 값이 50으로 재설정될 것으로 예상 while하지만 여기서는 재설정하지 않습니다.

또한 스크립트 상단에 있는 단일 변수로 많은 양의 데이터를 읽을 수도 있다는 사실도 확인했습니다.

bash이는 (가설적 으로나 ksh구문적으로) 더 효율적입니다 .

cut -c 7-21 "Data.txt" |
while read -r code; do
    if [[ ! -f "../FASTA_SEC/$code.fa" ]]; then
        printf 'No such file: %s\n' "../FASTA_SEC/$code.fa"
        continue
    fi

    for (( win = 2; win < 20; win += 2 )); do
        printf 'The value of win is %d, now entereing inner loop\n' "$win"

        for (( per = 50; per < 100; per += 2 )); do
            printf 'Value of per is %d\n' "$per"
        done
    done
done

이렇게 하면 전체 출력을 cut변수로 읽는 대신 한 줄씩 읽습니다.

또한 지루한 while루프를 방지합니다.

관련 정보