È possibile rendere la variabile all'interno nidificata per il ciclo locale


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

fuori fuori :

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

È possibile rendere la variabile all'interno nidificata per il ciclo locale.

Risposte:


9

Se si esegue la variabile interna in una sub shell, ciò non influirà sulla variabile esterna:

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

Che si traduce in:

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
Questo è valido, ma per favore no. Rende molto più difficile da leggere a colpo d'occhio.
Coteyr,

1
Abusare troppo delle sottotitoli potrebbe rendere la sceneggiatura notevolmente più lenta.
user23013

2
Ma è più difficile leggere solo a quelle persone che non abusano di sottotitoli.
user23013

9

È possibile rendere la variabile all'interno nidificata per il ciclo locale.

Sì, ma usando solo una funzione.

Poiché il built-in localpuò esistere solo all'interno di una funzione, è necessario fornire una funzione per fare in modo che la variabile icambi l'ambito da globale a locale:

#!/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
Anche valido e molto più facile da leggere.
Coteyr,

ho appena notato che l'uso di solo {} rende le variabili local.declaring the var using declarelo rende anche local
munish

1
@munish No, solo { }non è abbastanza. Sì, dichiarare rende una var locale all'interno di una funzione .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.