Shell变量的作用域问题
1、问题
Shell变量的作用域是在本Shell内,属于本Shell的全局变量,也就是从定义该变量的地方开始到Shell结束,或到主动使用unset删除了该变量的地方为止。在变量的作用域内,该变量都是可见的,在函数内对变量也是可以访问、可修改的,这和C语言极为不同。
2、差别
同样的代码用C实现后,VAR_02的值并没有受到函数内部同名变量的影响。
3、原因
存在这种差别的原因在于,Shell默认以Shell的进程ID作为一个命名空间,所以即便是在函数中声明变量,该变量也会在全局生效。而C语言会对函数内的变量单独创建命名空间,这样就不会影响全局定义的同名变量。Shell的这种特性在一般情况下是没有太大问题的,但有时确实可能会给程序的开发造成麻烦,特别是当脚本实现了模块化的开发后,不同的人共同维护同一个脚本中不同功能的代码时,很可能大家都会用到比较常见的类似于i、j、k这样的临时变量(特别是在函数内部,使用这样的变量尤为常见),这无疑会造成问题。
4、解决方案
为了解决这种问题,在函数内部声明的临时变量需要用local指定其为只在函数内生效的“局部变量”,这样这些变量将只存在于局部的命名空间内,从而不会对全局变量有影响。下面按照这种方式对Namespace03.sh进行修改,在函数内部使用local声明变量VAR_02,再次执行然后查看效果。
从执行结果可以看到,在函数体内使用local关键字声明了和全局变量同名的局部变量后,对该变量的操作只会影响局部变量,而不会影响与之同名的全局变量。