Чи можливо зробити змінну всередині вкладеною для циклу локальної


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

вихід:

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

Чи можливо зробити змінну всередині вкладеною для циклу локальної.

Відповіді:


9

Якщо ви запускаєте внутрішню змінну в під оболонці, вона не вплине на зовнішню змінну:

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

Результати:

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
Це дійсно, але, будь ласка, не варто. Це набагато важче читати з першого погляду.
coteyr

1
Занадто велика кількість зловживань із передплатами може зробити сценарій помітно повільнішим.
user23013

2
Але важче читати лише тим людям, які не зловживають передплатами.
user23013

9

Чи можливо зробити змінну всередині вкладеною для циклу локальної.

Так, але лише за допомогою функції.

Оскільки вбудований localможе існувати лише всередині функції, нам потрібно надати функцію, щоб змусити змінну iзмінити область застосування з глобальної на локальну:

#!/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
Також дійсно і читати набагато простіше.
coteyr

щойно помітив, що за допомогою просто {} робить змінні local.declareing var using declareтакож робить його локальним
munish

1
@munish Ні, тільки { }цього недостатньо. Так, оголосити робить var локальною функцією Inside .
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.