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
原文地址:https://www.cnblogs.com/franc/p/12555447.html