zoukankan      html  css  js  c++  java
  • shell高级-----创建函数

    基本脚本函数

    1、创建函数

    有两种格式可以用来在bash shell脚本中创建函数。
    第一种采用关键字function。后跟分配给该代码的函数名。

        function name {
         commands
        }
    

     name属性定义了赋予函数唯一的名称。脚本中定义的每个函数都必须有一个唯一的名称。
    commands是构成函数的一条或多条bash shell命令。在调用该函数时,bash shell会按命令在函数中出现的顺序依次执行,就像在普通脚本中一样。

    在bash shell脚本中定义函数的第二种格式更接近于其他编程语言中定义函数的方式。

        name(){
        conmmands
        }
    

     函数名后的空括号表明正在定义的是一个函数。这种格式的命名规则和之前定义shell脚本函数的格式一样。

    2、使用函数

    要在脚本中使用函数,只需要向其他shell命令一样,在行中指定函数名就行。

    [root@node1 ljy]# more ceshi.sh 
    #!/bin/bash
    function func1 {
       echo "hello everyone!"
    }
    count=1
    while [ $count -le 5 ]
    do
     func1
     count=$[ $count + 1 ]
    done
    [root@node1 ljy]# sh ceshi.sh 
    hello everyone!
    hello everyone!
    hello everyone!
    hello everyone!
    hello everyone!
    

    返回值

    有3种不同的方法来为函数生成退出状态码。

    1、默认退出状态码

    默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。

    如果之前命令有失败,但是最后一条命令是成功的,该函数的退出状态码也是0,所以使用默认退出状态码是很危险的。

    2、使用return命令

    return命令允许指定一个整数值来定义函数的退出状态码。

    [root@node1 ljy]# more ceshi.sh 
    #!/bin/bash
    function db1 {
       read -p "enter your value:" value
       echo "doubling the value"
       return $[ $value * 2 ]
    }
    db1
    echo "the new value is $?"
    [root@node1 ljy]# sh ceshi.sh 
    enter your value:3
    doubling the value
    the new value is 6
    

    如果使用这种方式来获取返回码,需要注意

    (1)函数一结束就取返回值。

    (2)退出状态码必须是0~255

    3、使用函数输出

    可以将函数的结果输出保存在变量中。

    [root@node1 ljy]# more ceshi.sh 
    #!/bin/bash
    function db1 {
       read -p "enter your value:" value
       echo $[ $value * 2 ]
    }
    result=$(db1)
    echo "the new value is $result"
    [root@node1 ljy]# sh ceshi.sh 
    enter your value:2
    the new value is 4
    

    在函数中使用变量

    像函数传递参数

    函数可以使用标准的参数环境变量来表示命令行上传给函数的参数。$#特殊变量表示传递给函数的参数个数。

    在脚本中指定函数时,必须将函数和参数放在同一行:funcl $valu1 10

    [root@node1 ljy]# more ceshi.sh 
    #!/bin/bash
    function addem {
       if [ $# -eq 0 ] || [ $# -gt 2 ]
       then 
          echo "-1"
       elif [ $# -eq 1 ]
       then
          echo $[ $1 + $1 ]
       else
          echo $[ $1 + $2 ]
       fi
    }
    echo -n "adding 10 and 5:  "
    value=$(addem 10 5)
    echo $value
    [root@node1 ljy]# sh ceshi.sh 
    adding 10 and 5:  15
    

    也可以这么玩

    [root@node1 ljy]# more ceshi.sh 
    #!/bin/bash
    function addem {
       if [ $# -eq 0 ] || [ $# -gt 2 ]
       then 
          echo "-1"
       elif [ $# -eq 1 ]
       then
          echo $[ $1 + $1 ]
       else
          echo $[ $1 + $2 ]
       fi
    }
    echo -n "the result is:  "
    value=$(addem $1 $2)
    echo $value
    [root@node1 ljy]# sh ceshi.sh 1 2
    the result is:  3
    

    在函数中处理变量

    函数使用两种类型的变量,全局变量和局部变量

    1、全局变量

    默认情况下,你在脚本中定义的任何变量都是全局变量。

    [root@node1 ljy]# more ceshi.sh 
    #!/bin/bash
    function func1 {
       temp=$[ $value + 5 ]
       value=$[ $temp + 1 ]
    
    }
    temp=2
    value=3
    
    func1
    
    echo -n "temp is :  "
    echo $temp
    echo -n "value is : "
    echo $value
    [root@node1 ljy]# sh ceshi.sh 
    temp is :  8
    value is : 9
    

    temp的数据就受到了影响。

    2、局部变量

    local 关键字保证了变量只局限在该函数中。

    [root@node1 ljy]# more ceshi.sh 
    #!/bin/bash
    function func1 {
       local temp=$[ $value + 5 ]
       value=$[ $temp + 1 ]
    
    }
    temp=2
    value=3
    
    func1
    
    echo -n "temp is :  "
    echo $temp
    echo -n "value is : "
    echo $value
    [root@node1 ljy]# sh ceshi.sh 
    temp is :  2
    value is : 9
    

    函数递归

    函数可以调用自己来得到结果。

    [root@node1 ljy]# more ceshi.sh 
    #!/bin/bash
    function func1 {
       if [ $1 -eq 1  ]
       then
          echo 1
       else
          local temp=$[ $1 - 1 ]
          local result=$(func1 $temp)
          echo $[ $result * $1 ] 
       fi
    }
    read -p "enter value: " value
    result=$(func1 $value)
    echo "the factorial 0f $value is : $result"
    [root@node1 ljy]# sh ceshi.sh 
    enter value: 5
    the factorial 0f 5 is : 120
    

    创建库

    bash shell允许创建函数库文件,然后在多个脚本中引用该库文件。

    1.创建一个包含脚本中所需函数的公用库文件

    2.在用到这些函数的脚本文件中包含库文件名。

    [root@node1 ljy]# more myfuncs 
    function addem {
       echo $[ $1 + $2 ]
    }
    [root@node1 ljy]# more ceshi.sh 
    #!/bin/bash
    . ./myfuncs
    result=$(addem 1 2)
    echo "result is $result"
    [root@node1 ljy]# sh ceshi.sh 
    result is 3
    

    使用函数库的关键在于source命令。

    source命令有个快捷的别名,叫做点操作符。

    . ./name

    在命令行上使用函数

    在命令行上创建函数

    有两种方法:

    一、采用单行方式定义函数

    [root@node1 ljy]# function func1 { echo $[ $1 + $2 ]; }
    [root@node1 ljy]# func1 1 2
    3
    

    退出当前终端失效。

    二、采用多行方式定义函数

    [root@node1 ~]# function func1 {
    > echo $[ $1 + $2 ]
    > }
    [root@node1 ~]# func1 1 3
    4
    

    在函数的尾部使用花括号,shell就会知道你完成了函数的定义。

    在.bashrc文件中定义函数

    为了防止每次退出shell后函数失效,可以将函数写在.bashrc文件。bash shell在每次启动时都会在主目录下查找这个文件。

    1.直接定义函数

    把你的函数直接写在文件末尾

    [root@node1 ~]# more .bashrc 
    # .bashrc
    
    # User specific aliases and functions
    
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi
    #a test function
    function func1 {
       echo $[ $1 + $2 ]
    }
    [root@node1 ~]# func1 2 3
    5
    

    2.读取函数文件

    在shell脚本中可以用source命令将库文件的函数添加到你的.bashrc文件中

    [root@node1 ~]# more .bashrc 
    # .bashrc
    
    # User specific aliases and functions
    
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi
    #a test function
    . /ljy/myfuncs
    [root@node1 ~]# more /ljy/myfuncs 
    function addem {
       echo $[ $1 + $2 ]
    }
    [root@node1 ~]# addem 1 3
    4
    
  • 相关阅读:
    什么是Spring的IOC和DI
    2021年ACP考试复习笔记-云服务器ECS知识点及练习
    个人站点搭建完成啦,欢迎前来参观~
    准备一台标准服务器(模版机)!
    正则表达式几个常用的特殊字符!
    Shell的几个重点工具
    Shell入门,关于语法的一些简单玩意儿
    Mysql for Linux的安装以及远程访问
    在学到MySQL索引时,涉及到了B树和B+树.聊一聊
    Linux的一些问题的处理(重要目录,/配置静态IP/主机名/hosts映射)
  • 原文地址:https://www.cnblogs.com/jinyuanliu/p/10913821.html
Copyright © 2011-2022 走看看