Shell编程之函数

Posted NicolasNRH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程之函数相关的知识,希望对你有一定的参考价值。

Shell编程之函数

  • Shell函数

    • 将命令序列按格式写在一起
    • 可方便重复使用命令序列
  • Shell函数定义

    [1]
    # 定义函数
    function 函数名 
    命令序列
    
    
    [2]
    函数名() 
    命令序列
    
    
    ########## main ##########
    # 调用函数
    函数名
    #!/bin/bash
    # 创建用户的函数
    
    user() 
    useradd $name
    echo 123456 | passwd --stdin $name
    
    
    read -p "请输入要创建的用户名:" name # 用户输入用户名
    
    user # 调用函数
  • 函数返回值

    • return表示退出函数并返回一个退出值,脚本中可以使用$?变量显示该值
    • 使用原则
    • 函数一结束就取返回值,因为$?变量值返回执行的最后一条命令的退出状态码
    • 退出状态码必须是0~255,超出时值将为该值除以256的取余值
    #!/bin/bash
    
    function test 
    read -p "请输入一个数值:" num
    return $[ $num * 2]
    
    
    test1() 
    read -p "请输入:" value
    echo $[$value * 2]
    
    
    ##### main #####
    result=$(test1)
    echo $result
    
    test
    echo $?
  • 函数传参

    • 函数体外的位置变量是运行脚本时传入的位置变量
    • 函数体内的位置变量是调用函数时传入的位置变量
    #!/bin/bash
    
    sum1() 
    sum=$[$1 +$2]
    echo $sum
    
    
    ########## main ##########
    read -p "请输入第一个位置参数" first
    read -p "请输入第二个位置参数" second
    
    result=$(sum1 $first $second)
    echo $result
  • 函数变量的作用范围

    • 函数在shell脚本中仅在当前shell环境中有效(除非是用的source)
    • Shell脚本中变量默认全局有效
    • 使用local命令将变量限定在函数内部
    #!/bin/bash
    
    myfun() 
    echo $i   # 8
    local i
    i=9
    echo $i   # 9
    
    i=8
    myfun
    echo $i   # 8
  • 递归

    • 函数调用自己本身的函数

    • 阶乘
    #!/bin/bash
    
    fact() 
        if [ $1 -eq 1 ] #输入为1时直接输出1
        then
            echo 1
        else
            local temp=$[$1 -1]
            local result=$(fact $temp) #调用自身且$1为temp的值实现递归调用
            echo $[$1 * $result]
                # 相当于5*$result(4*$result(3*$result(2*$result(1))))
        fi
    
    
    ########## main ##########
    
    read -p "请输入一个要阶乘的数值:" n
    
    result=$(fact $n)
    
    echo $result
    • 递归目录
    #!/bin/bash
    
    function 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
    
    
    ########## main ##########
    # 递归查看指定目录
    ## 第一个位置变量用于判断是目录或者文件,第二个位置变量用于给子目录或者子文件实现缩进
    list_files "/var/log" ""
    • 创建库

    vim myfuncs.sh

    # 一个简单的加减乘除阶乘的库
    addition()  #加法
        echo $[$1 + $2]
    
    
    multiplication()  #乘法
        echo $[$1 * $2]
    
    
    subtraction()  #减法
        ecno $[$1 - $2]
    
    
    division()  #除法
        if [ $2 -ne 0 ];then
            echo $[$1 /$2]
        else
            echo "0 不能作为除数"
        fi
    
    
    Factorial()  #阶乘
        if [ $1 -eq 1 ];then
            echo 1
        elif [ $1 -eq 0 ];then
            echo 0
        else
            local temp=$(subtraction $1 1)
            local result=$(fact $temp)
            echo $[$1 * $result]
            echo $(multiplication $1 result)
        fi
    
    • vim test.sh #编写测试脚本
    #!/bin/bash
    
    . /opt/myfuncs.sh
    
    v1=10
    v2=2
    
    resl=$(addition $v1 $v2)
    res2=$(subtraction $v1 $v2)
    res3=$(multiplication $v1 $v2)
    res4=$(division $v1 $v2)
    res5=$(Factorial $v1 $v2)
    
    echo "加法的结果是:$res1"
    echo "减法的结果是:$res2"
    echo "乘法的结果是:$res3"
    echo "除法的结果是:$res4"
    echo "阶乘的结果是:$res5"

以上是关于Shell编程之函数的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程之函数

shell编程之函数和case多条件分支语句

shell编程之函数

shell编程之函数

linux——shell编程之函数和循环控制

Shell之函数