在函数中处理变量
1.全局变量
全局变量是在 shell 脚本内任何地方都有效的变量。如果在脚本的主体部分定义了一个全局变量,那么就可以在函数内读取它的值。
类似地,如果在函数内定义了一个全局变量,那么也可以在脚本的主体部分读取它的值。
在默认情况下,在脚本中定义的任何变量都是全局变量。在函数外定义的变量可在函数内正常访问:
$ cat test8
#!/bin/bash
# using a global variable to pass a value
function dbl {
value=$[ $value * 2 ]
}
read -p "Enter a value: " value
dbl
echo "The new value is: $value"
$
$ ./test8
Enter a value: 450
The new value is: 900
$
$value 变量在函数外定义并被赋值。当 dbl 函数被调用时,该变量及其值在函数中依然有效。
如果变量在函数内被赋予了新值,那么在脚本中引用该变量时,新值仍可用。
但这种情况其实很危险,尤其是想在不同的 shell 脚本中使用函数的时候,因为这要求你清楚地知道函数中具体使用了哪些变量,包括那些用来计算非返回值的变量。
这里有个例子可以说明事情是如何被搞砸的:
$ cat badtest2
#!/bin/bash
# demonstrating a bad use of variables
function func1 {
temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
func1
echo "The result is $result"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
$
$ ./badtest2
The result is 22
temp is larger
$
由于函数中用到了$temp 变量,因此它的值在脚本中使用时受到了影响,产生了意想不到的后果。
有一种简单的方法可以解决函数中的这个问题,那就是使用局部变量。
2. 局部变量
无须在函数中使用全局变量,任何在函数内部使用的变量都可以被声明为局部变量。为此,
只需在变量声明之前加上 local 关键字即可:
local temp
也可以在变量赋值语句中使用 local 关键字:
local temp=$[ $value + 5 ]
local 关键字保证了变量仅在该函数中有效。如果函数之外有同名变量,那么 shell 会保持这两个变量的值互不干扰。
这意味着你可以轻松地将函数变量和脚本变量分离开,只共享需要共享的变量:
$ cat test9
#!/bin/bash
# demonstrating the local keyword
function func1 {
local temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
func1
echo "The result is $result"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
$
$ ./test9
The result is 22
temp is smaller
$
现在,当你在 func1 函数中使用$temp 变量时,该变量的值不会影响到脚本主体中赋给$temp 变量的值。