首页 > 编程笔记

Shell脚本函数中变量的用法

在 Shell 脚本函数中使用变量时,需要特别注意变量的定义方式以及处理方式。

Shell函数传递参数

在 Shell 中,函数可以使用标准的参数环境变量来表示命令行上传给函数的参数。在函数体内部,函数名会在“$n”变量中定义,函数命令行上的任何参数都会通过 $1、$2 等定义($1 表示第一个参数,$2 表示第二个参数)。同时也可以使用特殊变量“$#”来判断传给函数的参数数目。

在脚本中指定函数时,必须将参数和函数放在同一行中。例如:

abc $value1 5

其中,abc 就是一个函数。

【例 1】简单的函数的传参及返回值的情况。
使用 vim 编辑器打开脚本文件 test,输入 i 命令进入插入模式,输入如下命令:

function abc(){
    echo $1
    return 20
}
abc tom
echo $?

使用 sh(Bash)进程来执行脚本文件,输出结果为:

[root@bogon ~]# sh test.sh
tom
20

另外,还有特殊的字符用来处理参数,特殊字符及说明如表 1 所示。

表 1 特殊字符及说明
特殊字符 说 明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程的 ID 号
S! 后台运行的最后一个进程的 ID 号
$@ 与相同,但是使用时加引号,并在引号中返回每个参数
$- 显示 Shell 使用的当前选项,与 set 命令功能相同
$? 显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错

变量的处理

函数通常使用以下两种类型的变量:

1) 全局变量

全局变量是在 Shell 脚本中任何地方都有效的变量。当在脚本的主体部分定义一个全局变量时,可以在函数内读取它的值;当在函数内定义一个全局变量时,可以在主体部分读取它的值。

默认情况下,在脚本中定义的任何变量都是全局变量。在函数外定义的变量可以在函数内正常访问。

全局变量的作用范围是当前的 Shell 进程,而不是当前的 Shell 脚本文件,这两个是不同的概念。打开一个 Shell 窗口就创建了一个 Shell 进程,打开多个 Shell 窗口就创建了多个 Shell 进程,每个 Shell 进程都是独立的,拥有不同的进程 ID。在一个 Shell 进程中可以使用 source 命令执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效。

【例 1】Shell进程。
打开一个 Shell 窗口,定义一个变量 a 并赋值为 10,这时在同一个 Shell 窗口中是可正确打印变量 a 的值的,如下所示:

[root@bogon ~]# a=10
[root@bogon ~]# echo $a
10

再打开一个新的 Shell 窗口,同样输出变量 a 的值,但结果却为空,如下所示:

[root@bogon ~]# echo $a

[root@bogon ~]#

由此可以看出,全局变量 a 仅仅在定义它的第一个 Shell 进程中有效,对新的 Shell 进程没有影响。变量名相同但变量值可以不相同。

2) 局部变量

不需要在函数中使用全局变量,函数内部使用的任何变量都可以被声明成局部变量,只需要在变量声明的前面加上关键字 local。local 关键字保证了变量只局限在该函数中。

【例 2】局部变量。
使用 vim 编辑器打开脚本文件 test.sh,输入 i 命令进入插入模式,输入如下命令:

function abc(){ local a=10 } abc echo $a

使用 sh(Bash)进程来执行脚本文件,输出结果为:

[root@bogon ~]# sh test.sh

[root@bogon ~]#

可以看出输出结果为空,表明变量 a 在函数外部无效,是一个局部变量。

优秀文章