一 函数shell
函数与shell脚本没有明显区别,但在执行时有本质区别:bash
对于一个单独的shell脚本,执行时为其建立一个新的shell进程,并解释并执行脚本中代码函数
当脚本执行完成,该shell进程自动结束this
对于函数来讲,调用时不会单首创建一个shell进程,而是在调用者的shell进程中直接解释并执行函数中的代码命令行
函数定义:递归
function_name()进程
{ip
statement1get
}string
(也能够加function关键字,函数在调用前必须定义)
例子:
#! /bin/bash
#定义函数
functionsayhello()
{
echo "Hello, World!"
}
#调用函数
sayhello
函数调用:
function_nameparam1 param2
函数连接:
在某个shell函数中调用另一个函数的过程
例子:
#! /bin/bash
#定义函数john()
john()
{
echo "Hello, this is John."
}
#定义函数alice
alice()
{
#调用函数john
john
echo "Hello, this is Alice."
}
#调用函数alice
alice
结果:Hello, this is John.
Hello,this is Alice.
函数返回值:
shell能够用return语句来返回某个数值,只能返回0-255直接整数值,函数中的return语句其实是用来返回函数的退出状态码
例子:
#! /bin/bash
#定义求和函数
sum()
{
let "z = $1 + $2"
#将和做为退出状态码返回
return "$z"
}
#调用求和函数
sum 22 4
#输出和
echo"$?"
结果:26
(超过255会出错,如sum 253 4)
设置别名:
alias name=”command”
(name为要指定的名,command为原有shell命令)
函数和别名区别:
用户不能为一组命令指定别名
别名中不能经过系统变量操做参数列表
不用某个别名时,unalisa name
二 函数参数
2.2 获取函数参数个数
经过$#来获取脚本参数的个数
#! /bin/bash
#定义函数
func()
{
#输出参数个数
echo "the function has $#parameters."
}
#调用函数
func a b c d e f ghello
func 12 3"hello world"
func
(若参数中有空格,要用引号引发来)
2.2 经过位置变量接收参数值:
$0:脚本名称
$1:第一个参数
$2:第二个参数
$@和$*:全部参数
例:
#! /bin/bash
#定义函数
func()
{
#输出全部的参数hello world
echo "all parameters are $*"
#输出全部的参数hello world
echo "all parameters are $@"
#输出脚本名称
echo "the script's name is $0"
#输出第1个参数 hello
echo "the first parameter is $1"
#输出第2个参数 world
echo "the second paramter is $2"
}
#调用函数
func hello world
2.3 移动位置参数
shift命令使脚本全部参数左移一个位置
#! /bin/bash
#定义函数
func()
{
#经过while循环和shift命令依次获取参数值,$#获取传递给函数的参数个数
while (($# > 0))
do
#shift命令参数位置左移一个,原来的第二个参数会变成第一个,每次输出$1就能够了
echo "$1"
shift
done
}
2.4 经过getopts接收函数参数
getopts获取函数的选项以及参数值,或者是脚本的命令行选项以及参数值
getopts optstring[args]
参数optstring包含一个能够为getopts命令识别的选项名称列表。若是某个选项名称的后面跟随着一个冒号,则表示用户能够为该选项提供参数值,同时参数值被保存到名称为$OPTARG的系统变量中。
getopts依次遍历每一个选项,选项名称被保存到args变量中。
#! /bin/bash
#定义函数
func()
{
#逐个接收选项及其参数
while getopts "a:b:c" arg
do
#当指定了-a选项时
case "$arg" in
a)
#输出-a选项的参数值
echo "a's argument is$OPTARG"
;;
b)
echo "b's argument is$OPTARG."
;;
c)
echo "c"
;;
?)
#未知选项
echo "unkown argument."
exit 1
;;
esac
done
}
#调用函数
func -a hello -bworld
结果:a's argument is hello
b's argument is world
(a,b后面有冒号,能够含有参数,c不含参数,循环过程当中,当前选项名称被保存到arg中,选项的参数值被保存到系统变量$OPTARG中。当用户提供-c选项是,只是简单输出字符c)
2.5 间接参数传递:
经过间接变量引用来实现函数的参数的传递。若是某个变量的值又是另一个变量的变量名,则该变量称为间接变量。
var=name
name=john
第二个变量能够用两种方式引用:
${name}
${!var}
(shell中间接引用语法为${!var_name})
三 函数库文件
脚本与库文件之间的区别在于函数库文件只包括函数,脚本能够即包括函数和变量的定义,又包括执行的代码。
库文件有主程序载入并执行,用户无需拥有库文件的执行权限,只要读权限就能够。
3.1 函数库文件的调用
. filename(圆点和文件名之间有空格)
#! /bin/bash
#载入函数库
. lib.sh
#定义变量
msg="the fileis not found."
#调用函数库中的函数
error $msg
lib.sh文件:
#! /bin/bash
#定义函数
error()
{
#1和2都是文件描述符,1为标志输出,2标准错误输出,>&复制一个输出描述符
echo "ERROR:" $@ 1>&2
}
warning()
{
echo "WARNING:" $@ 1>&2
}
结果:ERROR:the file is not found
3.2 递归函数
调用过程就是反复的调用本身
#! /bin/bash
#定义递归函数
fact()
{
#定义局部变量
local n="$1"
#当n等于0时终止递归调用
if [ "$n" -eq 0 ]
then
result=1
else
#当n大于0时,递归计算n-1的阶乘
let "m=n-1"
fact "$m"
let "result=$n * $?"
fi
#将计算结果以退出状态码的形式返回
return $result
}
#调用递归函数
fact"$1"
echo"Factorial of $1 is $?"