Можно ли сделать переменную внутри вложенной для локального цикла

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

Можно ли сделать переменную внутри вложенной для локального цикла.

Munish
источник

Ответы:

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
joepd
источник
1
Это действительно, но, пожалуйста, не надо. Это делает это намного труднее читать с первого взгляда.
Котейр
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
Также допустимо, и намного легче читать.
Котейр
только что заметил, что использование just {} делает переменные локальными. Декларирование var используя declareтакже делает их локальными
munish
1
@munish Нет, только { }не достаточно. Да, объявление делает var локальным внутри функции .