1 函数的定义
function_name () 或 function function_name ()
{
statement1
statement2
...
}
函数必须在调用前定义
2 函数的调用
function_name param1 param2 ...
当用户定义了一个函数之后,实际上该函数就成为了一个合法的shell命令,可以在后续的脚本中使用。定义函数时需要圆括号,但调用时不需要圆括号。
3 函数的链接
所谓的函数链接,是指在某个shell中调用另外一个函数的过程
4 函数的返回值
在函数中,用户将需要返回的数据写入到标准输出,通常这个操作是使用echo语句来完成的。然后在调用程序中将函数的执行结果赋给一个变量。
eg.
length ()
{
str=$1
result=0
if [ "$str" != " " ]; then
result=${#str}
fi
echo "$result"
}
len=$(length "abc23")
由于用户可以将各种数据写入到标准输入,所以通过echo语句可以将各种数据作为返回值返回给函数调用者,而不仅仅局限于整数。因此,使用echo语句获得函数的返回值更加灵活和强大。
5 函数和别名
alias name="command"
alias ls="ls -l"
unalias ls 删除命令
我们定义了一个名称为ls的别名,而shell中已经存在了一个名称为ls的命令,但是在这种别名和同名命令同时存在的情况下,shell会优先使用用户定义的别名。
6 shell环境中定义函数
前文介绍的函数都是在脚本中定义的,实际上,用户可以直接在shell环境中定义函数,其方法就是直接在shell命令提示符后面一次输入函数名和函数体。
用户定义的shell函数可以通过unset命令来删除,删除以后的函数名将不再有效。
unset lsl()
7 全局变量与局部变量
默认情况下,除了与函数参数关联的特殊变量之外,其他所有变量都有全局的有效范围。另外,在函数内部,如果没有使用local关键字进行修饰,那么函数中的变量也是全局变量。
无论在何处,赋值语句都会影响全局变量的值,并且全局变量的值被改变了之后,在整个脚本内部有效。另外,默认情况下,在函数内部定义的变量也是全局变量,在脚本的任何位置都可以引用。
定义内部变量使用local关键字。
当某个程序中同时存在相同名称的全局变量和局部变量时,在函数内部,局部变量会屏蔽全局变量。也就是说,在函数内部,使用的是局部变量,而函数外面,使用的是全局变量。
8 函数参数
shell采取了相同的方法来处理脚本的参数和函数参数。因此,对于含有参数的函数,用户可以使用以下语法来调用。
function_name arg1 arg2 ...
shell的参数以空格隔开,如果某个参数中含有空格,则应该使用引号将其引用起来。
9 移动位置参数
在shell脚本中,可以使用shift命令来使得脚本的所有的位置参数向左移动一个位置。
10 通过getopts接收函数参数
getopts optstring [args]
11 间接参数传递
所谓间接参数传递,是指通过间接变量引用来实现函数参数的传递。如果某个变量的值又是另外一个变量的变量名,则该变量称为间接变量。
eg.
var=name
name=john
$var=name
${!var}=john
${name}=john
name=alice
${name}=alice
${!var}=alice
12 传递数组参数
a=(a b "c d" e)
func "${a[@]}"
其中${a[@]}可以获取数组所有元素值
数组元素个数与函数func()的实际参数的个数是相同的,因此,用户可以使用系统变量$#来获取数组元素的个数。
变量${a[@]}外面使用双引号引用起来,因为数组a的第三个元素中含有空格,在这种情况下,如果将变量${a[@]}外面的双引号去掉,则会将第三个元素误认为是2个元素。
13 函数库文件
为了方便重用某些功能,可以创建一些可重用的函数,这些函数可以单独地放在函数库文件中
脚本与库文件之间的唯一区别在于函数库文件通常只包括函数,而脚本中可以既包含函数和变量的定义,又包含可执行的代码。
在shell中,载入库文件的命令为.,即一个圆点,其语法如下:
. filename
库文件可以使用相对路径,也可以使用绝对路径,圆点和库文件名之间必须要有一个空格。
在用户使用库文件时,必须在调用函数前将库文件载入。
14 递归函数
阶乘函数:
fact ()
{
local n="$1"
if [ "$n" -eq 0 ]
then
result=1
else
let "m=n-1"
let "result=$n * $(fact m)"
fi
echo "$result"
}
fact "$1"
(此程序存在问题,待改正)