shell编程之函数以及函数中的递归(上)

简介: 在编写脚本时,有些脚本可以反复使用,可以调用函数来解决。语句块定义成函数约等于别名。函数的作用:使用函数可以避免代码重复;使用函数可以将一个大的工程分割为若干小的功能模块,代码的可读性更强。函数的使用方法:先定义函数再引用函数

1、定义、查看、删除函数


1.1 定义函数的方法

shell中定义函数有两种格式:

#格式一:
 function 函数名 {          //三部分之间都要有空格
    命令序列
 }
 #格式二:
 函数名 () {               //函数名和小括号之间的空格可有可无
    命令序列
 }
 ###### main #####
 #可以在主代码区域直接使用函数名调用函数
 函数名
复制代码


网络异常,图片无法展示
|


1.2 删除函数unset

格式: unset 函数名

[root@yuji sh]# unset hello     //删除函数
 [root@yuji sh]# hello           //删除后无法再调用
 bash: hello: 未找到命令...
复制代码


网络异常,图片无法展示
|


1.3 查看函数declare

格式:

declare -F      //查看函数列表
 declare -f      //查看函数具体的定义
复制代码


查看函数列表:

[root@yuji sh]# declare -F
 declare -f __HOSTNAME
 declare -f __SIZE
 declare -f __SLAVEURL
 declare -f __VOLNAME
 ......
复制代码


网络异常,图片无法展示
|


2、函数返回值


获得函数返回值的两种方式:

  1. return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值。
  2. 在函数体中用 echo 输出返回值。并在函数体外使用变量赋值后,可再进一步对函数的返回值进行加工操作。

2.1 使用return

return使用原则:

  1. 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码。
  2. 退出状态码必须是0~255,超出时值将为除以256取余。

示例:

#!/bin/bash
 #定义函数
 fun1 () {
         read -p "请输入一个数字:" num
         return $[$num*2]
 }
 ##### main ######
 #调用函数
 fun1
 #输出返回值
 echo $?
复制代码


网络异常,图片无法展示
|


2.2 使用echo

因为return的返回值的范围是0-255,超过部分除以256取余,得不到我们想要的结果,此时可以直接在函数体中使用echo命令。

示例:

#!/bin/bash
 #定义函数
 fun2 () {
         read -p "请输入一个数字:" num
         echo $[$num*2]
 }
 ##### main ######
 #在函数体外使用变量赋值,方便进一步对函数的返回值进行加工操作
 result=`fun2`
 #输出返回值
 echo $result
复制代码


网络异常,图片无法展示
|


3、函数传参


示例1:

#!/bin/bash
 sum1 () {
     sum=$[$1+$2]
     echo $sum
  }
  ######## main #######
  read -p "请输入第一个位置参数:" first
  read -p "请输入第一个位置参数:" second
  sum1 $first $second
复制代码


网络异常,图片无法展示
|


示例2:

#!/bin/bash
 sum2 () {
     sum=$[$1+$2]
     echo $sum
  }
 ######## main #######
 sum2 $1 $2
复制代码


网络异常,图片无法展示
|


示例3:

#!/bin/bash
 sum3 () {
 #函数中的$1,$2 代表调用函数时,函数后面跟的位置参数
     echo $1
     echo $2
  }
 ####### main #######
 #主体代码中的$1,$2 代表执行脚本时,脚本后面跟的位置参数
 sum3 $2 $1
复制代码


网络异常,图片无法展示
|


4、函数的作用范围

函数变量的作用范围:

  1. 函数在Shell脚本中仅在当前Shell环境中有效。(即定义和调用函数要在同一个shell环境中)
  2. 脚本中定义的变量,仅在当前shell环境中有效。
  • 如果使用source或 . 执行脚本,那么该变量在命令行也会生效,因为这两种方式没有打开子shell环境,而是在当前shell环境中执行脚本。一般建议不要使用source和. 来执行脚本,可能会影响系统资源配置。
  1. Shell脚本中变量默认全局有效。(即在整个脚本中都生效,并非是环境变量)
  2. 将变量限定在函数内部使用 local 命令。这样变量只在当前函数内有效,不影响脚本中的其他函数和变量。

示例1:

#!/bin/bash
 i=8
 i=9
 echo $i
复制代码


网络异常,图片无法展示
|


示例2:

#!/bin/bash
 myfun1 () {
 #没有被local定义的变量是全局有效的
     i=9
     echo $i
 }
 ########## main ###########
 i=8
 myfun1
 echo $i
复制代码


网络异常,图片无法展示
|


示例3:

#!/bin/bash
 myfun2 () {
 #local定义的变量只能在local命令之后到函数结束之前有效
     local i=9
     echo $i
 }
 ########## main ###########
 i=8
 myfun2
 echo $i
复制代码


网络异常,图片无法展示
|


示例4:

#!/bin/bash
 myfun3 () {
     echo $i
 #local定义的变量只能在local命令之后到函数结束之前有效
     local i=9
     echo $i
 }
 ########## main ###########
 i=8
 myfun3
 echo $i
复制代码


网络异常,图片无法展示
|



示例5:

#!/bin/bash
 myfun4 () {
 #没有被local定义的变量是全局有效的
     i=7
     echo $i
 #local定义的变量只能在local命令之后到函数结束之前有效
     local i=9
     echo $i
 }
 ########## main ###########
 i=8
 myfun4
 echo $i
复制代码


网络异常,图片无法展示
|


相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell Linux C语言
Shell 函数
10月更文挑战第4天
27 7
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
111 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
52 1
|
2月前
|
Shell Linux 开发工具
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
84 12
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
56 12