基本的脚本函数
# 第一种方式
function fname { #脚本中定义的函数名称必须有唯一的名称 fname 与 { 之间必须有空格
commands
}
# 另外一种方式
fname() {
commands
}
# 如果在函数定义前使用未定义的函数,会收到一条错误信息
# 如果函数在之前已经定义过,则新定义的函数会覆盖之前的定义
返回值
$?
函数的退出状态码,是函数最后一条命令返回的退出状态码
return
退出函数并返回特定的退出状态码(整数)
用$?
接函数返回值的注意点:
1.
函数结束直接取返回值,中间不可有任何命令
2.
退出状态码范围0~255
使用函数输出
val1=10
val2=30
my_fname(){
echo $[ $1 * $2 ]
}
result=$(my_fname $val1 $val2) # 结果为300
# 函数用echo来显示计算的结果,脚本会获取函数的输出,而不是退出状态码
# 可以返回浮点值和字符串值
在函数中使用变量
func1 $val1 100
函数使用特殊的变量作为自己的参数值,无法使用脚本在命令行的参数值
全局变量
是在shell脚本中任何地方都有效的变量,函数外定义的变量可以在函数内访问
*
函数内定义的变量,在调用该函数后,该变量也可以在函数外访问
局部变量
,只要在函数的声明前加上local
关键字即可,该变量只可以在函数内部使用
数组变量和函数
# 必须将数组变量的值分解为单个值,将这些值作为函数参数,在函数内,可将参数重组成一个新变量
function addarray{
newarray=($(echo $@))
for i in ${newarray[*]};do
done
}
myarray=(1 2 3 4 5)
arg1=(echo ${myarray[*]})
addarray $arg1 # 或者 addarray ${myarray[*]}
# 从函数返回数组
function returnarr{
local i
for (( i = 0; i <= 10; i++ )) # C语言风格for循环
{
newarray[$i]=$[ $i * 2 ]
}
echo ${newarray[*]}
}
result=$(returnarr)
echo "result:${result[*]}"
函数递归
# 计算 X 的阶乘
function factorial{
if [ $1 -eq 1 ];then
echo 1
else
local temp=$[ $1 - 1 ]
local result=$(factorial $temp)
echo $[ $1 * $result ]
}
创建库
*
创建库函数文件myfuncs
,里面有几个函数(add, div, mult)
*
在脚本文件中运行库文件(source ./myfuncs
)
*source
在当前shell上下文中执行命令,而不是创建新的shell,有个快捷操作符(.
点操作符)
#!/bin/bash
. ./myfuncs
val1=1
val2=2
add $val1 $val2
在命令行上使用函数
*单行方式定义函数
#function divem { echo $[ $1 * $2 ]; }
每个命令后面都要加上分号
*多行方式定义函数
function divem{
>echo $[ $1 * $2]
>}
divem 1 2 # 执行
*
如果函数名和内建命令或者另一个命令相同的名字,函数将会覆盖之前的命令
在.bashrc中定义函数
. /home/root/ymwork/my_shell_function
将命令放到.bashrc
脚本最后一行,shell可以使用定义好的函数,甚至不需要在子shell中对库文件使用source