留意shell变量作用域

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。

你可能感兴趣的:(shell,function)