ネストされた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変数として読み込むのではなく、1行ずつ読みます。

また、退屈なwhileループを防ぎます。

おすすめ記事