Aninhado Enquanto loop não funciona como esperado

1

Eu escrevi o seguinte script:

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

Eu esperava que funcionasse assim:

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

E assim por diante ... Eu pensei que poderia fazer isso com um tempo aninhado, mas obtive o seguinte resultado:

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

O loop interno só é executado uma vez quando o valor WIN é 2 e, em seguida, ganha o valor do investimento. Por que não funciona como desejado?

Como eu poderia definir uma variável como um intervalo com incrementos de 2. Por exemplo, $ PER = (Intervalo 50: 100, 2) ou mais para integrar esse intervalo em for i in $PER loop

O que você sugere?

Obrigado

    
por Neuls 12.01.2017 / 21:28

1 resposta

0

Você está esperando que o valor $PER seja redefinido para 50 para cada iteração do loop while externo, mas você não o redefine lá.

Eu também noto que você lê potencialmente muitos dados em uma única variável na parte superior do script.

Isso seria um pouco mais eficiente (assumindo bash ou ksh sintaxe):

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

Isso evita a leitura na saída completa de cut em uma variável e, em vez disso, lê-a linha por linha.

Também evita os incômodos while loops.

    
por 12.01.2017 / 21:48