bash变量作用域
bash的变量作用域其实很简单,不过有些时候可能看起来很奇怪。下面简单总结一下。
在默认的情况下,bash的变量都是全局的,除非你使用了local或者typeset命令来改变,那样就可以变成局部的了。
export改变的是变量是否对其子进程可见,并不会影响父进程,如果想要改变父进程中的变量可以用source(或者“.”)。需要额外说明的是,source后面的脚本不能有exit,否者父进程就跟着一起退出了。
在subshell中,对变量的改变不会影响到外面的shell。这似乎很容易理解,不过需要注意的是,一些管道(比如管道的一端是while循环时)也是通过subshell传递的,比如下面这个例子:
- foo=123
- foo=$line
- done
- echo $foo
这时就不那么容易觉察了。解决方法是,用重定向去替换管道。