Apakah mungkin untuk membuat variabel di dalam bersarang untuk loop lokal

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

keluar keluar :

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

Apakah mungkin untuk membuat variabel di dalam bersarang untuk loop lokal.

munish
sumber

Jawaban:

9

Jika Anda menjalankan variabel dalam di sub shell, itu tidak akan mempengaruhi variabel luar:

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

Yang mengakibatkan:

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
sumber
1
Ini valid, tapi tolong jangan. Sekilas membuat ini jauh lebih sulit untuk dibaca.
coteyr
1
Menyalahgunakan subkulit terlalu banyak bisa membuat skrip terasa lebih lambat.
user23013
2
Tetapi lebih sulit untuk membaca hanya untuk orang-orang yang tidak menyalahgunakan subkulit.
user23013
9

Apakah mungkin untuk membuat variabel di dalam bersarang untuk loop lokal.

Ya, tetapi hanya menggunakan fungsi.

Karena builtin localhanya bisa ada di dalam suatu fungsi, kita perlu menyediakan fungsi untuk membuat variabel imengubah ruang lingkup dari global ke lokal:

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

sumber
1
Juga valid, dan jauh lebih mudah dibaca.
coteyr
hanya memperhatikan bahwa menggunakan hanya {} membuat variabel lokal. Mengecek penggunaan var declarejuga membuatnya menjadi lokal
munish
1
@munish Tidak, hanya saja { }tidak cukup. Ya, menyatakan membuat var lokal Di dalam fungsi .