linux——shell:函数
目录
一、语法
function: function name { COMMANDS ; } or name () { COMMANDS ; }
Define shell function.
Create a shell function named NAME. When invoked as a simple command,
NAME runs COMMANDs in the calling shell's context. When NAME is invoked,
the arguments are passed to the function as $1...$n, and the function's
name is in $FUNCNAME.
Exit Status:
Returns success unless NAME is readonly.
1、创建函数“
写法1:
f_name(){
...函数体...
}
写法2:
function f_name{
...函数体...
}
写法3:
function f_name (){
...函数体...
}
示例:
pi@raspberrypi:~ $ func_test(){ echo test function; }
pi@raspberrypi:~ $ func_test
test function
2、删除函数:
pi@raspberrypi:~ $ unset func_test #删除函数
pi@raspberrypi:~ $ func_test
-bash: func_test: command not found
3、变量作用范围
3.1本地变量:local
作用范围:本地变量只能在函数内部定义,并且只在函数内部有效
[18:13:55 root@centos7 data]#num=200;func_test(){ num=100;echo $num; }
[18:14:36 root@centos7 data]#func_test
100
[18:14:44 root@centos7 data]#echo $num
100 #函数内定义的普通变量,会影响了函数外变量的值
[18:14:56 root@centos7 data]#
#定义本地变量
[18:14:56 root@centos7 data]#num=200;func_test(){ local num=100;echo $num; }
[18:17:44 root@centos7 data]#func_test
100
[18:17:50 root@centos7 data]#echo $num
200 #函数内使用关键字local生成的本地变量,只在本函数内有效
3.2普通变量:
作用范围:当前用户有效,切换用户后失效
#变量名=值,直接定义
[18:28:56 root@centos7 data]#num=300
3.3环境变量:
作用范围:当前shell范围内有全局有效,切换用户仍有效。
环境变量定义:
[18:23:14 root@centos7 data]#export TX=1 #方法1
[18:25:47 root@centos7 data]#declare -x TX2=2 #方法2
/etc/profile里存放的环境变量对于所有用户都有效。不管你是用什么用户登陆。
用户可以修改家目录下的.bashrc文件进行自定义。
4、匿名函数:
{echo x; escho y;} #只有函数体,没有f_name{},用于临时使用
5、查询系统环境中定义的函数
delare -f #显示系统中定义的函数名,及函数定义
delare -F #仅显示系统中定义的函数名
二、函数调用
2.1、脚本中创建函数,并直接调用:
2.2、引用文件中函数:
[14:33:08 root@centos7 data]#vim funcs.sh #创建函数
#/bin/bash
func_os_version(){
sed -nr 's/.*([0-9]+)\..*/\1/p' /etc/redhat-release
}
#编写脚本
[14:34:03 root@centos7 data]#vim func_reference.sh
#!/bin/bash
source funcs.sh #引用函数文件
echo "system version `func_os_version`" #调用函数
#执行脚本
[14:34:35 root@centos7 data]#bash func_reference.sh
system version 7
3、参数传递:
用$和数字接收传递的参数。 见练习1.2
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
4、return:返回值
见练习1.2
5、递归:
#函数自己调用自己
#计算10的阶乘,#n!=1×2×3×...×(n-1)×n
fact(){
if [ $1 -eq 0 ];then
echo 1
else
echo $[`fact $[$1-1]`*$1]
fi
}
fact $1 #调用
#执行
[19:30:56 root@centos7 data]#./fact.sh 7
5040
#下面的代码,同学可是试一下
.(){ .|.& };.
三、练习
1.1获取系统版本号
#!/bin
func_os_version(){
sed -nr 's/.*([0-9]+)\..*/\1/p' /etc/redhat-release
}
echo Os version is `func_os_version`
1.2判断是否为数字
[15:34:31 root@centos7 datavim func.sh 创建函数库
#判断是否为数字
func_is_digit(){
if [ ! "$1" ];then
echo "Usage:func_is_digit number"
return 10 #返回10 没有传递参数
elif [[ $1 =~ ^[[:digit:]]+$ ]];then
return 0 #为数字
else
return 1
fi
}
#调用函数
#!/bin/bash
source funcs.sh #引用函数
read -p "输入数字-->" num
func_is_digit $num #函数传递参数
flag=$? #保存函数返回值
if [ $flag -eq 1 ];then
echo "不是数字"
elif [ $flag -eq 0 ];then
echo “是数字”
else
echo !!!
fi