zoukankan      html  css  js  c++  java
  • linux shell 进阶篇、shell脚本编程-创建函数

    使用函数

    复制代码
    #!/bin/bash
    # testing the script
    
    function myfun {
      echo "This is an example of a function"
    }
    
    count=1
    while [ $count -le 5 ]
    do
      myfun
      count=$[ $count +1 ]
    done
    echo "This is the end of the loop"
    myfun
    echo "Now this is the end of the script"
    复制代码

    (记得空格,函数一定要在使用之前定义,函数名必须唯一)

    返回值
    可以通过$?来确定函数的退出状态

    使用return命令

    复制代码
    #!/bin/bash
    # testing the script
    function myfun {
      read -p "Enter a value:" value
      echo "double the value"
      return $[ $value * 2 ]
    }
    
    myfun
    
    echo "The new vlue is $?"
    复制代码

    结果:
    Enter a value:23
    double the value
    The new vlue is 46
    (退出状态的取值范围是0到255,$?是最近已执行命令的退出状态)

    使用函数输出,这种方法最靠谱了
    看例子

    复制代码
    #!/bin/bash
    # testing the script
    function myfun {
      read -p "Enter a value:" value
      echo $[ $value * 2 ]
    }
    
    result=`myfun`
    
    echo "The new vlue is $result"
    复制代码

    (这样就能很好的利用输出结果了)

    在函数中使用变量
    向函数传递参数

    复制代码
    #!/bin/bash
    # testing the script
    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 15:"
    value=`addem 10 15`
    echo $value
    echo -n "Just one number 10:"
    value=`addem 10`
    echo $value
    echo -n "No numbers:"
    value=`addem`
    echo $value
    echo -n "More than two numbers:"
    vaule=`addem 10 15 20`
    echo $value
    复制代码

    结果:
    Adding 10 and 15:25
    Just one number 10:20
    No numbers:-1
    (由上述可知,#可以得到参数的个数,#可以得到参数的个数,1表示第一个参数,$2表示第二个参数)

    复制代码
    #!/bin/bash
    # testing the script
    function addem {
      if [ $# -eq 0 ]||[ $# -gt 2 ]
      then
        echo -1
      elif [ $# -eq 1 ]
      then
        echo $[ $1 + $1 ]
      else
        echo $[ $1 + $2 ]
      fi
    }
    
    if [ $# -eq 2 ]
    then
      value=`addem $1 $2`
      echo "The value is $value"
    else
      echo "Usage:test1 a b"
    fi
    复制代码

    (函数外面的#表示调用脚本使用的参数数,函数里的#表示调用脚本使用的参数数,函数里的#表示调用函数使用的参数数,注意这点区别)

    作用域是变量的可见区域。
    全局变量,在shell脚本内处处有效的变量。函数中定义全局变量,那么主代码中有效。主代码中定义全局,函数中也有效。
    默认情况下,脚本中定义的变量都是全局变量。
    看例子:

    复制代码
    #!/bin/bash
    # testing the script
    function myfun {
      value=$[ $value * 2 ]
    }
    read -p "Enter a value:" value
    myfun
    echo "The new value is:$value"
    复制代码

    (输入45,得到90,这里的value在函数中发生变化了,到脚本中一样可以使用,而且已经变化了)

    局部变量
    作用范围只在函数当中
    关键字local

    复制代码
    #!/bin/bash
    # testing the script
    function myfun {
      local value=$[ $value * 2 ]
    }
    read -p "Enter a value:" value
    myfun
    echo "The new value is:$value"
    复制代码

    (输入45,输出45。因为加上local关键字之后,函数中的value是局部变量,与外界无关)

    复制代码
    #!/bin/bash
    # testing the script
    function myfun {
      local value=$[ $value * 2 ]
      echo $value
    }
    read -p "Enter a value:" value
    result=`myfun`
    echo "The new value is:$value"
    echo "The result of the fun is $result"
    复制代码

    (不过可以通过输出来获取函数处理的结果,这里的result还是处理后的结果,比如输入45,处理后是90)

    数组变量与函数

    复制代码
    #!/bin/bash
    # testing the script
    function addarray {
      local sum=0
      local newarray
      newarray=(`echo "$@"`)
      for value in ${newarray[*]}
      do
        sum=$[ $sum + $value ]
      done
      echo $sum
    }
    myarray=(1 2 3 4 5)
    echo "The original array is :${myarray[*]}"
    arg=`echo ${myarray[*]}`
    result=`addarray $arg`
    echo "The result is $result"
    复制代码

    结果:
    The original array is :1 2 3 4 5
    The result is 15
    (数组参数传入函数,函数获取后,进行处理输出。脚本将输出结果打印)

    复制代码
    #!/bin/bash
    # testing the script
    function addarray {
      local sum=0
      local newarray
      newarray=(`echo "$@"`)
      for value in ${newarray[*]}
      do
        sum=$[ $sum + $value ]
      done
      echo ${newarray[*]}
    }
    myarray=(1 2 3 4 5)
    echo "The original array is :${myarray[*]}"
    arg=`echo ${myarray[*]}`
    result=`addarray $arg`
    echo "The result is $result"
    复制代码

    (输出数组)

    函数递归

    复制代码
    #!/bin/bash
    # testing the script
    function factorial {
      if [ $1 -eq 1 ]
      then
        echo 1
      else
        local temp=$[ $1 -1 ]
        local result=`factorial $temp`
        echo $[ $result * $1 ]
      fi
    }
    
    read -p "Enter value:" value
    result=`factorial $value`
    echo "The factorial of $value is:$result"
    复制代码

    (输入5,输出120。大环套小环,小环套更小,逐步执行。
    我们一步一步剖析
    5输入得到5*4!
    4又得到4*3!
    3又得到3*2!
    2又得到2*1
    由此得到5*4*3*2*1也就是120


    显然单个脚本有助于减少输入量,但是如果多个脚本碰巧使用同样的函数又该怎样?
    创建库

    复制代码
    #my script functions
    function addem {
      echo $[ $1 + $2 ]
    }
    
    function multem {
      echo $[ $1 * $2 ]
    }
    
    function divem {
      if [ $2 -ne 0 ]
      then
        echo $[ $1 / $2 ]
      else
        echo -1
      fi
    }
    复制代码

    使用函数库的关键词是source

    #!/bin/bash
    # testing the script
    source ./myfuncs
    
    result=`addem 10 15`
    echo "The result is $result"

    (通过source就能使用库函数了)

    #!/bin/bash
    # testing the script
    . ./myfuncs

    result=`addem 10 15`
    echo "The result is $result"
    (或者点操作符,效果是一样的)

    在命令行中使用函数
    [root@localhost shellscript]# function multem {

    > echo [1*$2]

    > }

    [root@localhost shellscript]# multem 2 5

    10
    (多行命令)

    在.bashrc文件中定义函数
    直接在命令行定义shell函数的缺点是一旦退出shell,函数定义将失效。
    比较省事的方法是将函数定义在shell每次启动都能重新载入的地方。.bashrc文件就是这样的地方。
    可以用source(点操作符)将现有库文件的函数包含进.bashrc脚本。
    重新启动命令(source .bashrc)
    # .bashrc

    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi

    # User specific aliases and functions

    function addem {
      echo [1 + $2 ]
    }
    (重启之后,新加入的函数就有效了)

    脚本中也可以使用了

    ~~~~~~~~~~~~

    文章出处:http://www.cnblogs.com/jiqing9006/p/3253232.html

    ~~~~~~~~~~~~~

    感谢作者的总结

  • 相关阅读:
    C#修改SVG图片显示大小
    MyFessttoWord P9 ----UserControl and Side menu Content
    MyFessttoWord P8 ----PageViewModel
    MyFessttoWord Day2--依赖性属性
    西门子Profinet网络连接------实验
    MyFesettoWord_Day1
    ABP 使用Textarea 批量添加数据
    LINQ基础篇(中)
    centos7 cannot find a valid baseurl for repo
    Github上传项目详细教程
  • 原文地址:https://www.cnblogs.com/Star-Haitian/p/7337404.html
Copyright © 2011-2022 走看看