2016-04-12 4 views
1

Вложенные функции в цикле for, похоже, не работают должным образом. Разрывы цикла после перебора разаВложенные функции для цикла не работают

# copy files 
copyFiles() { 
    for ((i=0; i<${#filetype[@]}; ++i)); do 
    //some code goes here 
    done 
} 

# copy common components 
copyComponents() { 
    copyFiles $1 
} 

for ((i=0; i<3; ++i)); do 
    echo $i //iterates only once.. expectation is thrice 
    case $1 in 
    components) 
     copyComponents $module;; 
    *) 
     echo "unknown type" 
    esac 
done 

Я не уверен, что я делаю неправильно, но для выхода цикла после того, как переборе один раз.

ответ

2

Проблема в том, что все переменные в оболочке являются глобальными, если не указано иное. Вот простой пример, который демонстрирует это:

func() { 
    for ((i=0; i<10; ++i)); do 
     echo "func: $i" 
    done 
} 

for ((i=0; i<5; ++i)); do 
    echo "Loop: $i" 
    func 
done 

echo "$i" 

Если вы запустите, вы увидите, что после func выполняется в первый раз, значение глобальной переменной i является 11, что приводит к тому, внешний контур для выхода , Чтобы исправить это в bash, вы можете убедиться, что счетчик циклов в вашей функции остается локальным.

copyFiles() { 
    local i 
    for ((i=0; i<${#filetype[@]}; ++i)); do 
     # some code goes here 
    done 
} 
+0

Да, вы были правы @chepner. –