Shell局部变量大坑

325 阅读1分钟

在Shell中即使在函数体内创建的变量,也是全局变量!!! 来看一段代码

图片.png

这是一个递归函数, 简单解释一下,脚本的执行过程。

  1. 调用了test函数并传递字符串参数"1 2 3"
  2. 函数体内用list接收参数。调用系统函数把list为数组赋值给arr
  3. 递归跳出条件是:数组长度为0
  4. 循环调用函数test,注意这里我没给test传参,意味着循环体内每次调用test都会由于参数转为数组后是个空数组而退出。避免无线递归调用。

脚本预期执行结果应该是

arr[0]=1
0
arr[1]=2
0
arr[2]=3
0

但实际结果确是:

图片.png

2和3 哪去了??在苦苦查询资料后一句话惊醒了我。Shell中在函数体内创建的变量,也是全局变量!!!要创建局部变量只需要在变量前加个关键字local即可。