shell函数的使用方法,轻松写脚本


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"
    

    在这里插入图片描述


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值