for循环中的嵌套函数不起作用

时间:2016-04-12 17:32:27

标签: bash shell

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

我不确定我做错了什么但是在迭代一次后循环退出。

1 个答案:

答案 0 :(得分:2)

问题是shell中的所有变量都是全局变量,除非另有声明。这是一个更简单的例子来说明这一点:

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
}