• Linux Shell函数使用方法


    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

  • 相关阅读:
    我们的CPU遭到攻击[LOJ558]
    历史[ZJOI2018]
    字符串[LOJ6517]
    奥运公交[LOJ3255]
    BLO-Blockade[POI2008]
    压力[BJOI2013]
    Earthquake[USACO01OPEN]
    暴力写挂[CTSC2018]
    极简教程:数据结构与算法(二)
    DllRegisterServer的调用失败的问题解决方法
  • 原文地址:https://www.cnblogs.com/xingxingge/p/12310711.html
Copyright © 2020-2023  润新知