bash变量作用域

bash的变量作用域其实很简单,不过有些时候可能看起来很奇怪。下面简单总结一下。

在默认的情况下,bash的变量都是全局的,除非你使用了local或者typeset命令来改变,那样就可以变成局部的了。

export改变的是变量是否对其子进程可见,并不会影响父进程,如果想要改变父进程中的变量可以用source(或者“.”)。需要额外说明的是,source后面的脚本不能有exit,否者父进程就跟着一起退出了。

在subshell中,对变量的改变不会影响到外面的shell。这似乎很容易理解,不过需要注意的是,一些管道(比如管道的一端是while循环时)也是通过subshell传递的,比如下面这个例子

  1. foo=123
  2. echo 456 | while read line ; do
  3. foo=$line
  4. done
  5. echo $foo


这时就不那么容易觉察了。解决方法是,用重定向去替换管道。