函数
时间:2019-04-16 23:59:05 来源:igfitidea点击:
当脚本变得复杂时,需要使用分而治之的技术。 shell提供了函数的方法。
- 有时shell脚本会变得很复杂。为了避免大的和复杂的脚本,所以使用函数。
- 可以将大型脚本划分为称为函数的小块代码。
- 函数能使shell脚本模块化,易于使用。
- 函数避免了重复的代码。
- 函数用于执行特定的任务。
- 函数像普通命令一样使用。
- 在其他高级编程语言中,函数也称为过程、方法、子例程或者例程。
编写第一个shell函数
编写hello函数
hello() { echo 'Hello world!' ; }
调用hello()函数
函数可以像普通命令一样使用。
hello
将参数传递给hello()函数
- 可以将命令行参数传递给用户定义的函数。
- 使用变量$1,$2..$n来访问传递给函数的参数。
$0
始终指向shell脚本名。$*
或者$@
保存传递给函数的所有参数或参数。$#
保存传递给函数的参数的数量。
函数定义
hello() { echo "Hello , Nice to meet you." ; }
这时传递一个参数来调用hello函数
hello tom
在括号{}中的一行函数必须以分号结束。否则会报错。
xrpm() { rpm2cpio "" | cpio -idmv; } ### 分号不能省略。
如何显示函数名?
$0始终指向shell脚本名。
但是,还可以使用名为FUNCNAME的数组变量,该变量包含当前执行调用堆栈中所有shell函数的名称。索引为0的元素是当前正在执行的任何shell函数的名称。此变量仅在shell函数执行时存在。
#!/bin/bash # funcback.sh : Use $FUNCNAME backup(){ local d="" [[ -z $d ]] && { echo "${FUNCNAME}(): directory name not specified"; exit 1; } echo "Starting backup..." } backup
显示已定义的函数
使用declare命令显示已定义的函数名。
declare -f
显示已定义的函数和变量
declare
显示函数的源代码
declare -f | less
显示指定函数的源代码
declare -f functioName declare -f xrpm
删除函数
使用unset命令来删除函数
unset -f functionName unset -f hello declare
shell定义函数
函数定义必须是在脚本的最上面。
要加载一个函数文件,必须在脚本的最上面使用点命令
. /path/to/fuctions.sh
或者source命令source /path/to/fuctions.sh
进行
/etc/init.d/functions是默认的函数文件,其中包含/etc/init.d目录中大多数或所有shell脚本使用的函数。这个文件可以根据需要进行自动加载。
语法
name() compound_command ## POSIX兼容
或者
function name { ## ksh格式,可以在bash中运行 command1 command2 }
function name() { ## 只有bash中可以使用 command1 command2 }
单行函数语法
在**括号{}中的的一行函数必须以分号;**结尾:
function name { command1; command2; commandN;}
或者
name() { command1; command2; commandN;}
其中name是函数的名称,**command1; ... commandN;**是函数中使用的命令列表。
示例
挂载NAS设备的函数
mount_nas(){ # define variables NASMNT=/nas10 NASSERVER="nas10.nixcraft.net.in" NASUSER="vivek" NASPASSWORD="myNasAccountPassword" [ ! -d $NASMNT ] && /bin/mkdir -p $NASMNT mount | grep -q $NASMNT [ $? -eq 0 ] || /bin/mount -t cifs //$NASSERVER/$NASUSER -o username=$NASUSER,password=$NASPASSWORD $NASMNT }
在脚本的开头定义所有变量和函数:
#!/bin/bash # 在脚本的开头定义变量 # 这样我们的函数就可以访问它了 TEST="/tmp/filename" # 写delete_file()函数 delete_file(){ echo "Deleting $TEST..." } # 调用 delete_file 函数 delete_file
如果函数定义在函数调用之后,则会报错 delete_file: command not found
函数的本地变量
- 默认情况下,所有变量都是全局的。
- 在函数中修改一个变量会改变整个脚本变量的值。 为避免这种情况,可以使用local命令创建一个局部变量(本地变量)
local var=value local varName
或者(在函数内定义)
function name(){ local var= command1 on $var }
它使变量仅限于在该函数及其子函数中使用。
示例
试着去掉local运行,比较结果
#!/bin/bash # 全局变量d d=/Hello # 用户定义函数 change_d(){ # d仅在这个函数内可见 local d= echo "change_d:$d" } echo "设置前d值 $d" change_d "World" echo "设置后d值 $d"