shell函数的使用方法,轻松写脚本_shell脚本函数调用怎么写-程序员宅基地

技术标签: 运维  linux  centos  


shell函数

1.函数的作用

  • 语句块定义成函数约等于别名,定义函数,再引用函数
  • 封装的可重复利用的具有特定功能的代码
  • 2.函数的基本格式

    法一:
    [function] 函数名 (){
          
    	命令序列
    	[return x]         #使用return或者exit可以显式的结束函数
    }
     
    法二:
    函数名(){
          
    	命令序列
    }
    

    3.函数注意事项

    1.直接写函数中调用

    2函数直接写函数名同名函数后一个生效

    3.调用函数一定要先定义

    4.只要先定义了调用的其他函数,定义顺序无关

    4.函数调用的方法

    示例:

    #!/bin/bash
    h () {
          
    echo "hello"
    }
     
    w () {
          
    echo "world"
    }
     
    nihao () {
          
    h
    w
    }
     
    h
    w
    nihao
    

    在这里插入图片描述
    示例:

    #!/bin/bash
    #递归环境变量PATH里包含的所有目录,显示所有目录下的子目录和文件
    
    IFS_OLD=$IFS
    IFS=$IFS':'
    list() {
          
      for fd in $1/*
      do
        if [ -d $fd ];then
          echo "$fd 是目录"
          list "$fd"
        else
          echo "$fd 是文件"
        fi
      done
    }
    
    for dir in $PATH
    do
      list $dir
    done
    
    IFS=$IFS_OLD
    
    

    在这里插入图片描述

  • 使用函数可以避免代码重复
  • 使用函数可以将大的工程分为若干小的功能模块,代码的可读性更强
  • 5.函数的返回值

  • return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
  • 函数的使用原则
  • 1.函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;

    2.退出状态码必须是0~255,超出时值将为除以256取余。

    示例:

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

    在这里插入图片描述

    6.函数的传参

  • 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。
  • 示例:

    #!/bin/bash
    sum () {
          
    echo "第一个变量:" $1
    echo "第二个变量:" $2
    let n=$1+$2
    echo $n
    }
    sum $2 $1
    

    在这里插入图片描述

    7.在外部调用函数

  • 在外部调用命令需要先source一下。然后调用函数,再调用函数中的变量
  • [root@yxp data]#vim function.sh
    #!/bin/bash
    color () {
          
    RED="echo -e \E[31m"
    GREEN="echo -e \E[32m"
    END="\E[0m"
    }
    

    在这里插入图片描述
    示例:
    在脚本中调用
    在这里插入图片描述

    8.函数变量的作用范围

  • 函数在shell脚本中仅在当前shell环境中有效(除非使用source运行,在运行shell脚本中,是在一个子shell环境中运行的)
  • shell脚本中变量默认全局有效
  • 将变量限定在函数体内部使用local命令
  • 示例:

    #!/bin/bash
    aa () {
          
    a=10
    }
     
    a=20
    aa
    echo $a
    

    在这里插入图片描述

    示例2:

    #!/bin/bash
    aa () {
          
    local a=10
     
    }
     
    a=20
    aa
    echo $a
    

    在这里插入图片描述

    9.函数的递归

  • 函数调用自己本身的函数(直到没有目录为止)
  • #!/bin/bash
    #使用递归进行阶乘运算
    fact () {
          
    #判断传入的参数,如果是1,则直接输出1
    if [ $1 -eq 1 ]
    then
       echo 1
    else
    local temp=$[$1 - 1]
    local result=$(fact $temp)
    #如果传入的参数不是1,则函数调用函数自身,传入参数计算
    echo $[$1 * $result]
    fi
    }
    #####main######
    read -p "请输入一个正整数:" num
    result=$(fact $num)
    echo "$num 的阶乘结果是:$result"
    #fact 5
    #递归分解
    #5 temp=4 result=$(fact 4)   echo 5 * $(fact 4)
    #fact 4
    
    #4 temp=3 result=$(fact 3)   echo 5 * 4*$(fact 3)
    
    #fact 3
    #3 temp=2 result=$(fact 2)   echo 5 * 4*3$(fact 2)
    
    #fact 2
    #2 temp=1 result=$(fact 1)   echo 5 * 4*3*2*$(fact 1)
    
    #fact 1
    #1 temp=4 result=$(fact 4)   echo 5 * 4*3*2*1*$(fact 4)
    
    
    

    在这里插入图片描述

    10.函数库的作用

  • 可以事先创建一个函数库文件,在里面定义各种常用的函数,然后可以在别的shell脚本中直接引用这个函数库文件,使得不需要再次定义函数即可直接调用函数
  • [root@localhost ~]# cat myfunctions.sh
    #!/bin/bash
    #创建函数库文件
    jiafa(){
          
      echo $[$1 + $2]
    }
    
    jianfa(){
          
      echo $[$1 - $2]
    }
    
    chengfa(){
          
      echo $[$1 * $2]
    }
    
    chufa(){
          
      if [ $2 -eq 0 ];then
        echo "除数不能为0"
      else 
        echo $[$1 / $2]
      fi
    }
    
    fact(){
          
      if [ $1 -eq 1 ];then
        echo 1
      else
        local temp=$[$1 - 1]
        local result=$(fact $temp)
        echo $[$1 * $result]
      fi
    }
    #!/bin/bash
    #调用函数库
      source ~/myfunctions.sh
    
    v1=10
    v2=5
    
    res1=$(jiafa $v1 $v2)
    res2=$(jianfa $v1 $v2)
    res3=$(chengfa $v1 $v2)
    res4=$(chufa $v1 $v2)
    res5=$(fact $v1)
    
    echo "加法结果为:$res1"
    echo "减法结果为:$res2"
    echo "乘法结果为:$res3"
    echo "除法结果为:$res4"
    echo "${v1}阶乘结果为:$res5"
    

    在这里插入图片描述


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_66997367/article/details/124162268

智能推荐

html矩形框填充颜色的代码,js canvas绘制填充填充矩形添加边框颜色-程序员宅基地

文章浏览阅读2.2k次。效果图:源码:html>canvas绘制填充矩形//绘制无填充矩形varmy1=document.getElementById("mycanvas");//访问mycanvasvarctx=my1.getContext("2d");//这个参数不需要改动ctx.beginPath();//创建路径ctx.lineWidth=5;//边框大写,也就是描边ctx.strokeSt..._js 绘制带边框的填充矩形 linewidth

Dynamic Proxy模式_dyproxy-程序员宅基地

文章浏览阅读966次。 Dynamic Proxy 是JDK 1.3 版本中新引入的一种代理机制。严格来讲,Dynamic Proxy本身并非一种模式,只能算是Proxy 模式的一种动态实现方式,不过为了与传统Proxy 模式相区分,这里暂且将其称为“Dynamic Proxy 模式”来泛指通过Dynamic Proxy 机制实现的Proxy 模式。 通过Decorator模式,我们可以改写接口_dyproxy

【Cisco Packet Tracer】运输层端口与DHCP的作用_cisco dhcp端口-程序员宅基地

文章浏览阅读1.7w次,点赞81次,收藏65次。这篇文章摘要将介绍人工智能在医疗领域的应用。随着技术的迅猛发展,人工智能在医疗诊断、治疗和研究方面展现出巨大的潜力。我们将深入探讨人工智能在医学影像解读上的应用,如何通过深度学习算法提高医生对X光、MRI等图像的准确性。_cisco dhcp端口

JavaScript----闭包函数-程序员宅基地

文章浏览阅读3.2k次,点赞5次,收藏16次。闭包函数 作用域链 优缺点_闭包函数

时序分解 | EEMD集合经验模态分解时间序列信号分解Matlab实现_eemd matlab-程序员宅基地

文章浏览阅读953次,点赞19次,收藏14次。信号去噪是信号处理中的一个重要课题,其目的是从含有噪声的信号中提取出有用信号。近年来,经验模态分解(EMD)算法因其在信号去噪方面的优异性能而备受关注。然而,传统EMD算法存在分解结果不稳定、易受噪声影响等问题。为了克服这些问题,本文提出了一种基于总体平均经验模态分解(EEMD)算法的信号去噪方法。_eemd matlab

Android腾讯微薄客户端开发八:微博查看(转播,对话,点评)-程序员宅基地

文章浏览阅读86次。Android如果是自己的微博,可以干掉它下面三幅图是转播,对话以及点评界面Java代码publicclassWeiboDetailActivityextendsActivity{privateDataHelperdataHelper;privateUserInfouser;p...

随便推点

修改el-tooltip组件的背景色_改变el-tooltip颜色-程序员宅基地

文章浏览阅读1.2k次。修改el-tooltip组件的背景色。_改变el-tooltip颜色

手动上传snapshot和第三方jar包到nexus3-程序员宅基地

文章浏览阅读1.3k次。1、新建repositorysnapshot和第三方jar包的repository的类型是hosted且Version pollcy是Mixed,否则无法上传。2、手动上传选择jar包手动上传即可转载于:https://www.cnblogs.com/MakeInstall/p/11041262.html..._nexus修改snapshots可以支持手工上传jar

基于matlab的稀疏表示KSVD算法图像去噪_字典学习 稀疏编码 图像去噪-程序员宅基地

文章浏览阅读441次。稀疏表示KSVD算法是图像去噪问题中比较有效的方法之一,本文将详细介绍在matlab平台上如何使用KSVD算法进行图像去噪,并提供完整的源代码。KSVD算法是一种基于字典的稀疏表达方法,其核心思想是将待处理图像分解为一些基础元素的线性组合形式,即通过求解一个优化问题,来获取合适的基础元素和系数表达式。稀疏编码则负责计算每个字典元素的系数,使得最终重构得到的图像与原始图像之间的误差最小。2)初始化字典D,通常采用大小为[KxN]的随机矩阵,其中K表示字典中元素的数量,N表示图像块的大小。_字典学习 稀疏编码 图像去噪

golang基础 第3章 (struct,函数,方法,接口,泛型,类型集,类型)_go 泛型 struct-程序员宅基地

文章浏览阅读1k次,点赞19次,收藏25次。golang 基础之struct func 方法 接口 泛型_go 泛型 struct

socket.io-client的4.0封装使用-程序员宅基地

文章浏览阅读4.3k次,点赞2次,收藏10次。socket.io-client的二次封装,4.0版本,含有心跳连接、连接超时、连接错误等监听_socket.io-client

git基础教程(21)git restore还原改动-程序员宅基地

文章浏览阅读8.3k次,点赞3次,收藏2次。git restore <file>表示将在工作空间但是不在暂存区的文件撤销更改.git restore --staged <file>作用是将暂存区的文件从暂存区撤出,但不会更改文件。演示1:1、仓库初始状态:干净的仓库,下面有一个readme文件小静静@DESKTOP-MD21325 MINGW64 /d/test1/test1 (master)$ git statusOn branch masterYour branch is up to date with_git restore

推荐文章

热门文章

相关标签