Vamos resolver essa questão passo a passo. Para isso, numerei as linhas:
1 var=0
2 func(){
3 local var=$var;
4
5 let var=var+1
6 }
7 while [ $var -lt 5 ]; do
8 let var=var+1
9 done
10 func;
11 echo Valor final é $var
O código executa de cima pra baixo, linha a linha. Na linha 1, a var = 0; na linha 2, temos a função “func()” e, quando ela for chamada, na linha 10, o var da linha 3 assume o valor “0”; e o var da linha 5 assume o valor 0+1 = “1”.
Eu fiz essa conta com a função func porque ela tá no código, mas ela não infuencia no valor final da variável conforme pede a questão. Repare que o while executa independentemente da função “func”, pois ele tá fora dela. Você pode até mesmo remover a função func e deixar só o while que ele executa normalmente.
Voltando à sequência do código, quando entramos no loop, o while não enxerga o novo valor, ou seja, “1”, visto que se trata de um valor local da função interna func() - e, como vimos, while não tem nada a ver com ela. Var, então, continua sendo “0”.
Fiz a tabela abaixo com um passo a passo para melhor compreensão:
LOOP ; VALOR DA VARIAVEL
Loop 1($var =0); Let var = 0+1 = 1
Loop 2($var = 1); Let var = 1+ 1 = 2
Loop 3($var = 2); Let var = 2+ 1 = 3
Loop 4($var = 3); Let var = 3+ 1 = 4
Loop 5($var = 4); Let var = 4+ 1 = 5 (Parou aqui, uma vez que a questão informa que o loop vai até antes de 5, ou seja, 4.
Quando o while termina, seu valor final, de var assumiu o valor 5.