shell变量的作用域大部分都是全局的。这点非常不好。经常会造成意想不到的后果。所以强烈建议在定义每一个变量时都先声明为local的。
举例如下:
f1.sh:
function f1() {
line="f1,hhaha"
}
f2.sh
function f2() {
local line=""
read line
echo $line
}
test.sh
#! /bin/sh
. f1.sh
. f2.sh
line="main"
f1
echo $line
f2
echo $line
然后运行:sh -x test.sh
输出如下:
+ . f1.sh+ . f2.sh
+ line=main
+ f1
+ line=f1,hhaha
+ echo f1,hhaha
f1,hhaha
+ f2
+ local line=
+ read line
hey
+ echo hey
hey
+ echo f1,hhaha
f1,hhaha
可见,f1中的line把原来的line值覆盖了。而f2中使用了local就不会产生这种情况。
还有,一些变量特别容易忽略,如 read line。此时line是一个全局变量。必须在开始声明
local line
再调用read line。