函数

时间:2019-04-16 23:59:05  来源:igfitidea点击:

当脚本变得复杂时,需要使用分而治之的技术。 shell提供了函数的方法。

  1. 有时shell脚本会变得很复杂。为了避免大的和复杂的脚本,所以使用函数。
  2. 可以将大型脚本划分为称为函数的小块代码。
  3. 函数能使shell脚本模块化,易于使用。
  4. 函数避免了重复的代码。
  5. 函数用于执行特定的任务。
  6. 函数像普通命令一样使用。
  7. 在其他高级编程语言中,函数也称为过程、方法、子例程或者例程。

编写第一个shell函数

编写hello函数

hello() { echo 'Hello world!' ; }

调用hello()函数

函数可以像普通命令一样使用。

hello

将参数传递给hello()函数

  1. 可以将命令行参数传递给用户定义的函数。
  2. 使用变量$1,$2..$n来访问传递给函数的参数。
  3. $0始终指向shell脚本名。
  4. $*或者$@保存传递给函数的所有参数或参数。
  5. $#保存传递给函数的参数的数量。

函数定义

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

函数的本地变量

  1. 默认情况下,所有变量都是全局的。
  2. 在函数中修改一个变量会改变整个脚本变量的值。 为避免这种情况,可以使用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"