了解一下Shell函数

196 阅读2分钟

函数的概念

为什么要用函数

y=f(x)

sin cos tan

在编写脚本时,有些脚本可以反复使用,可以调用函数来解决

语句块定义成函数约等于别名

函数使用方法

  1. 定义函数
  2. 再引用函数

基本格式

1.

function 函数名 { 

命令序列

}

2.

函数名(){

命令序列

}

3.

function func_name () {

...函数体...

}

注意事项:

  1. 直接写 函数中调用函数 直接写函数名
  2. 同名函数 后一个生效
  3. 调用函数一定要先定义
  4. 只要先定义了调用的 其他函数定义顺序无关
func_name (){
...函数体...
}

定义函数
[root@localhost data]#func1 (){ hostname;date;}
#定义函数
[root@localhost data]#func1
#调用函数
localhost.localdomain
20211023日 星期六 10:23:50 CST

#注意调用的位置
h () {

echo "hello"

}
nihao () {
echo `h`  `w`

}

w () {
echo "world"
}

nihao


####
同名函数

查看函数

[root@localhost ~]# declare -F
#函数列表
declare -f __HOSTNAME
declare -f __SIZE
declare -f __SLAVEURL
[root@localhost ~]# declare -f
#函数具体的定义


判断操作系统版本:
[root@localhost ~]#cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

删除函数

unset func_name
[root@localhost ~]# dir
anaconda-ks.cfg       pricegame.sh  sum.sh  公共  视频	文档  音乐
initial-setup-ks.cfg  sum1.sh	    yum.sh  模板  图片	下载  桌面

函数的返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值

使用原则:

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
  2. 退出码必须是0-255,超出的值将为除以256取余
#!/bin/bash
test1 () {
        read -p "请输入一个数字:" num
        return $[$num*2]


}

test1
echo $?

怎么解决超过 255

#!/bin/bash
test1 () {
        read -p "请输入一个数字:" num
        echo $[$num*2]


}

result=`test1`
echo $result
return 用法

user () {
if  [ $USER = root ] 
then
echo "这是管理员用户"
else
echo "这不是管理员用户"
return 1
fi

}

函数的传参数

sum1 (){
	sum=$[$1 +$2]
	echo $sum
}

read -p "请输入第一个参数:" num1
read -p "请输入第一个参数:" num2
sum1 $num1 $num2






sum1 () {
        sum=$[$1 + $2]
        echo $sum
}
sum1 10 20

函数变量的作用范围:

函数在shell脚本中仅在当前的shell环境中有效

shell脚本中函数的变量默认全局有效

将变量限定在函数内部使用local命令

[root@localhost opt]# vim demo8.sh
#!/bin/bash
myfun(){
i=8
echo $i

}
myfun

[root@localhost opt]# chmod +x demo8.sh 
[root@localhost opt]# ./demo8.sh 
8
[root@localhost opt]# vim demo8.sh
#!/bin/bash
myfun(){
i=8
echo $i

}
myfun
echo $i
[root@localhost opt]# ./demo8.sh 
8
8
[root@localhost opt]# ./demo8.sh 
8
8
[root@localhost opt]# cat demo8.sh 
#!/bin/bash
myfun(){
i=8
echo $i

}
i=9
myfun

echo $i
[root@localhost opt]# ./demo8.sh 
8
8
[root@localhost opt]# cat demo8.sh 
#!/bin/bash
myfun(){
i=8
echo $i

}
myfun
i=9
echo $i

[root@localhost opt]# ./demo8.sh 
8
9

使用函数文件

我们可以新建一个专门存放函数的文件

[root@localhost data]#vim functions 

ostype (){
   if  grep -i -q "linux 6" /etc/os-release
   then
   echo "centos6"
   elif grep -i -q "linux 7" /etc/os-release
   then
   echo "centos7"
   elif grep -i -q "linux 8"  /etc/os-release
   then
   echo "centos8"
  else

color () {
RED="echo -e \E[31m"
GREEN="echo -e \E[32m"
END="\E[0m"

引用时
[root@localhost data]#. functions 
[root@localhost data]#ostype 
centos7

[root@localhost data]#color
[root@localhost data]#${GREEN}MMM$END
##会变颜色
MMM



[root@localhost data]#bash os.sh 
centos7
XXXX
[root@localhost data]#vim os.sh 
[root@localhost data]#bash os.sh 
centos7
XXXX

函数的作用范围

[root@localhost ~]#name=qian
[root@localhost ~]#func1 () { name=li ; echo $name; }
[root@localhost ~]#func1
li
[root@localhost ~]#echo $name 
li
[root@localhost ~]#name=qian;func1 () { local name=li ;echo $name; };echo $name
#加上local变量即可将变量限制在函数内
qian

函数递归

函数调用自己本身的函数

#阶乘

5! 1* 2 * 3 * 4 * 5

for循环
#!/bin/bash
sum=1
read -p "请输入一个数字:" num
for i in `seq $num`
do
let sum=$[i*sum]
done
echo $sum

函数调用自己
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ] 
then
echo 1
else
echo $[$1*$(fact $[$1-1])]
 fi
}
fact $1