O que estou fazendo errado aqui (problema com loops)

0

Essa coisa aqui

n=0
x=1
while [ $n -lt 6 ]
do
         n=$(( n+1 ))
         echo "sasadgsad gsda $n" >> /home/test/rptest

if [ $n -eq 5 ]
   then
      while [ $x -le 5 ]
      do
         echo "end of line$x" >> /home/test/rptest
         x=$(( x+1 ))
      done
 fi
done

Produza essa coisa

sasadgsad gsda 1
sasadgsad gsda 2
sasadgsad gsda 3
sasadgsad gsda 4
sasadgsad gsda 5
end of line1
end of line2
end of line3
end of line4
end of line5
sasadgsad gsda 6

Essa 11ª linha não deveria estar lá ... A primeira coisa que não deveria terminar quando n = 5? Por que cria essa última linha?

Obrigado pela ajuda:)

Eu até tentei com n = 1 e enquanto [$ n -le 5]

    
por iamAguest 07.08.2018 / 15:53

1 resposta

2

Seu script com recuo adequado:

n=0
x=1
while [ $n -lt 6 ]; do
    n=$(( n+1 ))
    echo "sasadgsad gsda $n" >> /home/test/rptest

    if [ $n -eq 5 ]; then
        while [ $x -le 5 ]; do
            echo "end of line$x" >> /home/test/rptest
            x=$(( x+1 ))
        done
    fi
done

Seu loop externo é executado de 0 a 5, o que é seis vezes. Como você atualiza n no início do loop externo, o valor de n passará de 1 a 6 no corpo do loop. Quando n é 5, você executa outro loop de 1 a 5 apresentando end of line... . Quando isso for feito, você ainda terá uma iteração do loop externo para fazer.

Outra maneira de escrever o script em bash :

for (( n=1; n<=5; ++n )); do
    printf 'sasadgsad gsda %s\n' "$n"

    if (( n == 5 )); then
        for (( x=1; x<=5; ++x )); do
            printf 'end of line%s\n' "$x"
        done
    fi
done >>/home/test/rptest

Isso não terá o mesmo problema porque o loop externo pára quando n atinge 6.

No entanto, se você quiser apenas anexar a saída do loop interno após a saída do outer, você pode executar o seguinte após o outro:

for (( n=1; n<=5; ++n )); do
    printf 'sasadgsad gsda %s\n' "$n"
done >>/home/test/rptest

for (( n=1; n<=5; ++x )); do
    printf 'end of line%s\n' "$n"
done >>/home/test/rptest

ou, apenas para este exemplo simples,

printf 'sasadgsad gsda %s\n' {1..5} >>/home/test/rptest
printf 'end of line%s\n' {1..5} >>/home/test/rptest
    
por 07.08.2018 / 15:59