É possível tornar a variável aninhada dentro do loop local


9
#!/bin/bash
for i in  1 2 3 4
do

#   {
#   local i     ##gives error  local: can only be used in a function
    for i in 1 2 3
    do
    echo "inner loop ----- $i"
    (( i++ ))
    done
#   }
echo $i
done

fora fora :

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4

É possível tornar a variável aninhada dentro do loop local.

Respostas:


9

Se você executar a variável interna em um sub shell, ela não afetará a variável externa:

for i in 1 2 3 4; do
    (
        for i in 1 2 3; do
            echo "inner loop ----- $i"
            (( i++ ))
        done
    )
    echo $i
done

O que resulta em:

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4

1
Isso é válido, mas por favor não. Isso torna muito mais difícil ler de relance.
Coteyr

1
Abusar demais de subshells pode tornar um script visivelmente mais lento.
User23013 16/05

2
Mas é mais difícil ler apenas para as pessoas que não abusam de subcascas.
User23013 16/05

9

É possível tornar a variável aninhada dentro do loop local.

Sim, mas apenas usando uma função.

Como o builtin localsó pode existir dentro de uma função, precisamos fornecer uma função para fazer com que a variável imude o escopo de global para local:

#!/bin/bash

internalfunction () {
    local i     ### Works as is inside a function
    for i in 1 2 3; do
        echo "inner loop ----- $i"
        (( i++ ))
    done
}

for i in  1 2 3 4; do
    echo $i
    internalfunction
done

$ ./script.sh
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3

1
Também é válido e muito mais fácil de ler.
coteyr 16/05

só notei que o uso de apenas {} faz com que as variáveis local.declareing o var utilizando declaretambém torna mais locais
Munish

1
@ Munish Não, apenas { }não é suficiente. Sim, declare torna um var local Dentro de uma função .
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.