• Shell函数的7种用法介绍


    1. 在shell文件内部定义函数并引用:

    复制代码代码如下:

    [~/shell/function]# cat factorial.sh 
    #!/bin/bash
    function factorial
    {
    factorial=1
    for (( i=1;i <= $1;i++ ))
            do
            factorial=$[ $factorial * $i ]
            done
    echo $1的阶乘是:$factorial
    }
    echo '程序名':$0,用于求阶乘
    factorial $1
    [~/shell/function]# ./factorial.sh 10

    程序名:./factorial.sh,用于求阶乘
    10的阶乘是:3628800

    2.返回值

    函数返回码是指函数最后一条命令的状态码,可以用于函数返回值
    使用return命令手动指定返回值:

    复制代码代码如下:

    [~/shell/function]# cat return.sh 
    #!/bin/bash
    function fun1 {
      read -p "enter a: " a
      echo -n "print 2a: "
      return $[ $a * 2 ]
    }
    fun1
    echo "return value $?"
    [~/shell/function]# ./return.sh 
    enter a: 100
    print 2a: return value 200

    由于shell状态码最大是255,所以当返回值大于255时会出错。

    复制代码代码如下:

    [~/shell/function]# ./return.sh 
    enter a: 200
    print 2a: return value 144

    3.函数输出

    为了返回大于255的数、浮点数和字符串值,最好用函数输出到变量:

    复制代码代码如下:

    [~/shell/function]# cat ./fun_out.sh 
    #!/bin/bash
    function fun2 {
      read -p "enter a: " a
      echo -n "print 2a: "
      echo $[ $a * 2 ]
    }
    result=`fun2`
    echo "return value $result"
    [~/shell/function]# ./fun_out.sh     
    enter a: 400
    return value print 2a: 800

    4.向函数传递参数(使用位置参数):

    复制代码代码如下:

    [~/shell/function]# cat ./parameter.sh 
    #!/bin/bash
    if [ $# -ne 3 ]
    then
        echo "usage: $0 a b c"
        exit
    fi
    fun3() {
        echo $[ $1 * $2 * $3 ]
    }
    result=`fun3 $1 $2 $3`
    echo the result is $result
    [~/shell/function]# ./parameter.sh  1 2 3
    the result is 6
    [~/shell/function]# ./parameter.sh  1 2
    usage: ./parameter.sh a b c

    5.全局变量与局部变量

    默认条件下,在函数和shell主体中建立的变量都是全局变量,可以相互引用,当shell主体部分与函数部分拥有名字相同的变量时,可能会相互影响,例如:

    复制代码代码如下:

    [~/shell/function]# cat ./variable.sh    
    #!/bin/bash
    if [ $# -ne 3 ]
    then
        echo "usage: $0 a b c"
        exit
    fi
    temp=5
    value=6
    echo temp is: $temp
    echo value is: $value
    fun3() {
        temp=`echo "scale=3;$1*$2*$3" | bc -ql`   
        result=$temp
    }
    fun3 $1 $2 $3
    echo "the result is $result"
    if [ `echo "$temp > $value" | bc -ql` -ne 0 ]
    then 
        echo "temp is larger"
    else
        echo "temp is still smaller"
    fi
    [~/shell/function]# ./variable.sh  12 3 2
    temp is: 5
    value is: 6
    the result is 72
    temp is larger

    在这种情况下,在函数内部最好使用局部变量,消除影响。

    复制代码代码如下:

    [~/shell/function]# cat ./variable.sh 
    #!/bin/bash
    if [ $# -ne 3 ]
    then
        echo "usage: $0 a b c"
        exit
    fi
    temp=5
    value=6
    echo temp is: $temp
    echo value is: $value
    fun3() {
        local temp=`echo "scale=3;$1*$2*$3" | bc -ql`   
        result=$temp
    }
    fun3 $1 $2 $3
    echo "the result is $result"
    if [ `echo "$temp > $value" | bc -ql` -ne 0 ]
    then 
        echo "temp is larger"
    else
        echo "temp is still smaller"
    fi
    [~/shell/function]# ./variable.sh  12 3 2
    temp is: 5
    value is: 6
    the result is 72
    temp is still smaller

    6.向函数传递数组变量:

    复制代码代码如下:

    [~/shell/function]# cat array.sh 
    #!/bin/bash
    a=(11 12 13 14 15)
    echo ${a[*]}
    function array(){
      echo parameters : "$@" 
      local factorial=1
      for value in "$@"
      do
        factorial=$[ $factorial * $value ]
      done
      echo $factorial
    }
    array ${a[*]}
    [~/shell/function]# ./array.sh 
    11 12 13 14 15
    parameters : 11 12 13 14 15
    360360

    7.函数返回数组变量

    复制代码代码如下:

    [~/shell/function]# cat array1.sh 
    #!/bin/bash
    a=(11 12 13 14 15)
    function array(){
      echo parameters : "$@" 
      local newarray=(`echo "$@"`)
      local element="$#"
      local i
      for (( i = 0; i < $element; i++ ))
      {
        newarray[$i]=$[ ${newarray[$i]} * 2 ]    
      }
      echo  new value:${newarray[*]}
    }
    result=`array ${a[*]}`
    echo ${result[*]}
    [~/shell/function]# ./array1.sh 
    parameters : 11 12 13 14 15 new value:22 24 26 28 30

    FROM:  http://www.jb51.net/article/57951.htm

     
  • 相关阅读:
    《精通Ext JS 》
    《OpenStack部署实践》
    《方寸指间——移动设计实战手册》
    《产品经理那些事儿》
    C# 基于Aspose.Cells的数据导出到Excel
    mongodb中直接根据某个字段更新另外一个字段值
    C# mongodb中内嵌文档数组条件查询
    c# 在mongo中查询经纬度范围
    (转)MySql 获取所有级联父级或所有级联子级
    mongodb对数组元素及内嵌文档进行增删改查操作(转)
  • 原文地址:https://www.cnblogs.com/ilinuxer/p/7077238.html
Copyright © 2020-2023  润新知