Czy możliwe jest, aby zmienna wewnątrz była zagnieżdżona dla pętli lokalnej?

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

outout:

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

Czy możliwe jest, aby zmienna wewnątrz była zagnieżdżona dla pętli lokalnej?

Munish
źródło

Odpowiedzi:

9

Jeśli uruchomisz zmienną wewnętrzną w podpowłoce, nie wpłynie to na zmienną zewnętrzną:

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

Co skutkuje w:

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
joepd
źródło
1
To jest poprawne, ale proszę nie. To sprawia, że ​​jest to znacznie trudniejsze do odczytania na pierwszy rzut oka.
coteyr
1
Nadużywanie podpowłoki może znacznie spowolnić skrypt.
user23013
2
Ale trudniej jest czytać tylko tym osobom, które nie nadużywają podpowłoki.
user23013
9

Czy możliwe jest, aby zmienna wewnątrz była zagnieżdżona dla pętli lokalnej?

Tak, ale tylko przy użyciu funkcji.

Ponieważ funkcja wbudowana localmoże istnieć tylko wewnątrz funkcji, musimy zapewnić funkcję, aby zmienna izmieniła zakres z globalnego na lokalny:

#!/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

źródło
1
Również ważne i znacznie łatwiejsze do odczytania.
coteyr
właśnie zauważyłem, że użycie tylko {} powoduje, że zmienne stają się lokalne. deklaracja zmiennej przy użyciu declarerównież czyni ją lokalną
poniedziałek
1
@munish Nie, tylko { }nie wystarczy. Tak, deklaracja czyni zmienną lokalną Wewnątrz funkcji .