Shell函数的作用及解析

本文详细介绍了Shell脚本函数的使用,包括如何定义和调用函数,函数在循环中的应用,如break和continue命令。还展示了如何编写用户自定义函数并使其在登录系统后可用,以及函数作用域、参数传递的实例。同时,通过具体示例讲解了递归函数的实现。内容涵盖函数的多种应用场景,是Shell脚本编程的实用指南。
摘要由CSDN通过智能技术生成

作用

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

Shell函数定义 (先定义后调用)

[ function ]  函数名(){
     命令序列
       [return x]       使用return或exit可以显式地结束函数

调用函数的方法

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

暂停循环命令

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

例如:

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

函数应用

两个数字求和
通过sum () {}定义函数
使用read命令交互输入两个数并求和

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

在这里插入图片描述

#!/bin/bash
# 函数求和
sum(){                             函数体
  read -p "输入的第一个数:" num1     变量1
  read -p "输入的第二个数:" num2     变量2
  echo "你输入的这两个数为 $num1和$num2"
  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 命令无效

函数的作用范围

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

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

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

设置有内部变量

[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

在这里插入图片描述

都是全局变量

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

在这里插入图片描述

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

在这里插入图片描述

函数的参数

参数的用法

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

参数的表示方法

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

1.7.3 通过函数参数将日志信息写入文件
通过定义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."

在这里插入图片描述

递归函数

调用自己本身的函数

递归遍历目录
通过定义递归函数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" ]             如果是目录
    then echo "$2$f"               输出原样
    list_files "$1/$f" " $2"  如果是子目录 输出缩进
    else                      
    echo "$2$f"                如果是文件 输出原样
    fi                           
  done
}
list_files "/var/log" ""

-d:测试是否为目录

在这里插入图片描述

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

[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、付费专栏及课程。

余额充值