shell函数

一、Shell函数的概述

1.1 函数的定义

就是将命令序列按格式写在一起,可方便重复使用命令序列

注:Shell函数是需要定义然后在调用

1.2.函数的作用

在编写Shell脚本的时候,经常会发现多个地方使用同一段代码,如果只是一小段代码,一般也无关紧要,但是要在脚本中多次重写大块代码的话就太累了,Shell中的函数就可以解决这个问题,可以将代码放进函数体封装起来,在需要的地方直接调用它就可以了,它可以提高脚本的可读性和重用性

1.3.函数的格式

[ function ] 函数名(){
命令序列
[return x] ##使用return或exit可以显式地结束函数
}
return:可以返回状态码或者数据(echo输出)
exit: 只返回状态码

 [ function ] 函数名(){
 命令序列
 [return x]      ##使用return或exit可以显式地结束函数
 }
return:可以返回状态码或者数据(echo输出)
exit: 只返回状态码

函数的名称必须是唯一的,如重名了,相当于你重新定义了函数,会覆盖之前函数的内容

1.4.调用函数的方法

函数名 [参数1] [参数2]

1.5.暂停循环命令

break:退出整个循环
continue:退出本次循环

示例:

for   i  ......
  for     j    ......
  continue           跳出j循环,i循环继续进行
  break               跳出整个循环

函数应用示例:

解析:
两个数字求和
通过sum(){}定义函数
使用read命令交互输入两个数并求和
函数写好了要调用它才起作用!

#!/bin/bash
# 函数求和
	sum(){                             函数体
  read -p "输入的第一个数:" num1     变量1
  read -p "输入的第二个数:" num2     变量2
  sum=$(($num1+$num2))
  echo "这两个数的和为:$sum"
}
sum                               调用函数

编写登录系统后便可使用的用户自定义函数(函数嵌套)

解析:
编辑用户自定义函数文件/root/function
在当前Shell中加载可执行的函数文件/root/function
在~/.bashrc文件中添加source /root/function命令

[root@server2 ~]# vim function
[root@server2 ~]# chmod +x function     当前shell可以在当前的bash中可执行
[root@server2 ~]# echo 'source /root/function' >> ~/.bashrc  当前用户在登录时可执行该shell命令

函数脚本

servicectl_usage(){     语法  
  echo "Usage:service <service-name> <start|stop|restart|reload|status>"
  return 1  返回值      服务名称                        动作
}
chk_centos_ver(){                                                重镜像
   grep "CentOS.*release 7." /etc/centos-release &> /dev/null && echo "7"
   grep "CentOS.*release 6." /etc/centos-release &> /dev/null && echo "6"
   grep "CentOS.*release 5." /etc/centos-release &> /dev/null && echo "5"
}                     此文件中包括该参数       混合输出在屏幕上不显示                                                          
servicectl(){
[[ -z $1 || -z $2 ]] && servicectl_usage
[ $(chk_centos_ver)=="7" ] && systemctl $2 $1 || service $1 $2
}

.* :表示任意一个字符,可以重复前面字符0次或多次
-z:表示字符串内容为空

在这里插入图片描述
注:CentOS 6 重启服务使用命令:service network restart,
systemctl restart network 命令无效

1.6 函数的作用范围

函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令

1.7 函数内部变量通过local来实现

通过定义myfun函数,在其内部设置局部变量i
函数内部和外部分别赋值,进行结果验证

示例:
1.设置内部变量

[root@server2 ~]# vi fun_scope.sh
[root@server2 ~]# chmod +x fun_scope.sh 
[root@server2 ~]# ./fun_scope.sh 
myfun()
{
  local i     内部
  i=8
  echo $i
}
i=9
myfun
echo $i

2.设置全局变量

  [root@server2 ~]# vi fun_scope.sh
  [root@server2 ~]# ./fun_scope.sh 


myfun()
{  
  i=10
  echo $i
}
i=9
myfun
echo $i

1.8 函数的参数

1.参数的用法

 函数名称     参数1    参数2    参数3  ......

2.参数的表示方法

 $1    $2   $3   .......${10}  ${11} ......

示例:

通过函数参数将日志信息写入文件
通过定义appendfile函数实现

[root@server2 ~]# vi write_log.sh
[root@server2 ~]# chmod +x write_log.sh 
[root@server2 ~]# ./write_log.sh 
[root@server2 ~]# cat /data/my.log 

#!/bin/bash
# 文件内容写入
mydir=/data
outfile=${mydir}/my.log
[ -e "${mydir}" ] || mkdir -p ${mydir}
appendfile (){
   echo "$2" >> "$1"                      先引用后追加
}
appendfile ${outfile} "first line content."
appendfile ${outfile} "second line content."

二、递归函数

1.1 递归作用

调用自已本身的函数

1.2 递归遍历目录

通过定义递归函数list_files来实现

[root@server2 ~]# vi fun_recursion.sh 
[root@server2 ~]# chmod +x fun_recursion.sh 
[root@server2 ~]# ./fun_recursion.sh 


list_files()
{
  for f in `ls $1`
 do
    if [ -d "$1/$f" ]             如果是目录       -d:测试是否为目录
    then echo "$2$f"               输出原样
list_files "$1/$f" " $2"  如果是子目录 输出缩进
else                      
echo "$2$f"                如果是文件 输出原样
fi                           
  done
}
list_files "/var/log" ""

在这里插入图片描述

创建一个三层目录文件进行查看

[root@server2 ~]# cd /var/log
[root@server2 log]# mkdir -p a/b/c
[root@server2 log]# cd a/b/c
[root@server2 c]# vi 1.txt
[root@server2 c]# cd
[root@server2 ~]# cd /var/log
[root@server2 log]# ls -lh

在这里插入图片描述

[root@server2 log]# cd
[root@server2 ~]# ./fun_recursion.sh

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值