变量

全局变量与局部变量

不同于其他编程语言,Shell语法中,如果不特殊声明的话,所有的变量都是全局变量,即使你在函数中声明的变量,一旦函数被引用,这个变量就会生效,直到脚本结束的全生命周期内,这个变量都可以被随时引用。

诸如下面的例子

#!/bin/bash

function example1
{
    var=75
}

# 此时由于没有被引用,所以$var为空
echo "var is $var"

example1

function example2
{
    echo "var is $var"
}

# 由于$var在example1函数中被调用,所以$var都有值
echo "var is $var"
example2

执行这个脚本:sh variable.sh,输出结果如下:

[@kMBP:crontab]$ sh var.sh 
var is 
var is 75
var is 75

第一次输出结果为空

分析:因为虽然我们在函数example_1中定义了变量var的值为75,但我们并未引用函数,所以变量值并不生效,所以输出为空

第二次输出结果为75

分析:第二次输出结果之前,我们已经调用了example_1函数,虽然只是在函数体内定义的变量,但由于未对变量做特殊声明,所以变量var的值为75生效

第三次输出结果为75

分析:虽然我们实在函数example_2中直接引用了变量var的值,但是在shell脚本中不做特殊声明,变量都是全局的,所以var的值一直到脚本结束,都有效,所以输出仍为75

如果想在脚本中对变量定义为局部变量,则必须使用local关键字,看下面例子

#!/bin/bash

function example1
{
    local var=75
    echo "var is $var"
}

example1

# 此时由于$var被声明成为局部变量,所以$var为空
echo "var is $var"

执行脚本,输出结果如下:

[@kongpinfandeMBP:crontab]$ sh var.sh 
var is 75
var is 

结果分析:

第一次输出75是因为调用了函数,函数体内变量var生效,所以输出值75

第二次输出空,是因为函数调用结束,该变量声明周期就结束了,变量var被销毁了,所以输出为空。