shell 函数定义

函数的定义和基本知识
向函数传递参数
函数返回值
函数调用:脚本放置多个函数;函数相互用;一个函数调用多个函数
局部变量和全局变量
函数递归:使用局部变量的递归;不使用局部变量的递归
函数的定义和基本知识
函数是一串命令的集合,函数可以把大的命令集合分解成若干较小的任务。编程人员可以基于函数进一步的构造更复杂的Shell 程序,而不需要重复编写相同的代码。下面给出了Linux Shell中函数的基本形式
                function_name()
               {
                    command1
                    command2
                    …    
                    commandN
                }
对函数结构进行解释:
其中标题:函数名,函数体:函数内的命令集合,在编写脚本时要注意标题名应该唯一,如果不唯一,脚本执行时会产生错误。
在函数名前可以加上关键字function,但加上和省略关键字function对脚本的最终执行不产生任何影响。
函数体中的命令集合必须含有至少一条命令,即函数不允许空命令,这一点和C语言不同。
函数之间可通过参数、函数返回值交互,函数在脚本中出现的次序可以是任意的,但是必须按照脚本中的调用次序执行这些函数。
向函数传递参数
在bash Shell编程中,向函数传递的参数仍然是以位置参数的方式来传递的,而不能传递数组等其它形式变量,这与C语言或Java语言中的函数传递是不同的。
#function4.sh
#!/bin/bash

half()
{
     let "n = $1"
     let "n = n/2"
     echo "In function half() n is $n"
}

let "m = $1"
echo "Before the function half() is called, m is $m"
half $m
echo "After the function half() is called, m is $m"
在Linux Shell编程中,函数还可传递间接参数,但该方式传递方式远远没有C语言和Java语言灵活,而只能使用第9章所述的间接变量引用来传递参数,这种方式是一种笨拙的间接参数传递方式。其中表达式expr1为循环变量赋初值的语句

#function6.sh
#!/bin/bash

ind_func()
{
    echo " $1"
}

parameter=ind_arg
ind_arg=Hello

ind_func "$parameter"

ind_func "${!parameter}"

echo "***********************"

ind_arg=World
ind_func "$parameter"
ind_func "${!parameter}"

函数返回值
有时需要脚本执行完成后返回特定的值来完成脚本的后继操作,这些特定的值就是函数返回值。在Linux Shell编程中,函数通过return返回其退出状态,0表示无错误,1表示有错误。在脚本中可以有选择的使用return语句,因为函数在执行完最后一条语句后将执行调用该函数的地方执行后继操作。

#function7.sh
#!/bin/bash

show_week()
{
     echo -n "What you input is: "
     echo "$1"

    case $1 in 
    0)
        echo "Today is Sunday. "
        return 0;;
    1)
        echo "Today is Monday. "
        return 0;;
    2)
        echo "Today is Tuesday. "
        return 0;;
    3)
        echo "Today is Wednesday. "
        return 0;;
    4)
        echo "Today is Thursday. "
        return 0;;
    5)
        echo "Today is Friday. "
        return 0;;
    6)
        echo "Today is Saturday. "
        return 0;;
    *)
        return 1;;
    esac
}

if show_week "$1"
then
    echo "What you input is right! "
else 
    echo "What you input is wrong! "
fi
exit 0
脚本放置多个函数
可以在脚本中放置多个函数,脚本执行时按照调用函数的顺序执行这些函数.
#function9.sh
#!/bin/bash

show_week()
{
    for day in Monday Tuesday Wednesday Thursday Friday Saturday Sunday
    do
        echo  -n "$day "
    done
    echo ""
}

show_number()
{
    for(( integer = 1; integer <= 7; integer++ ))
    do
        echo -n "$integer "
    done
     
    echo ""
}

show_square()
{
    i=0
    
    until [[ "$i" -gt 7 ]]
    do
        let "square=i*i"
        echo "$i * $i = $square"
        let "i++"
    done
}

show_week
show_number
show_square
函数相互调用
在Linux Shell编程中,函数之间可以相互调用,调用时会停止当前运行的函数转去运行被调用的函数,直到调用的函数运行完,再返回当前函数继续运行。
一个函数调用多个函数
在Linux Shell编程中允许一个函数调用多个函数,在该函数调用其他函数时同样需要按照调用的顺序来执行调用的函数。
局部变量和全局变量
在Linux Shell编程中,可以通过local关键字在Shell函数中声明局部变量,局部变量将局限在函数范围内。此外,函数也可调用函数外的全局变量,如果一个局部变量和一个全局变量名字相同,则在函数中局部变量将会覆盖掉全局变量
函数递归
Linux Shell中可以递归调用函数,即函数可以直接或间接调用其自身。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。例13-12是一个递归调用的例子。
                             #例13-12:function12.sh演示了一个函数递归调用
                             #!/bin/bash
 
                              #递归调用函数
                              foo()
                             {
                                    read y
                                    foo $y
                                    echo "$y"
                              }
 
                              #调用函数
                            foo
                            exit 0

使用局部变量进行递归一般是针对数值运行来使用的。阶乘运算是一个使用局部变量的递归调用过程,实现了n! 的运算,其可以通过下面的公式表示:
                    n!=1           (n=0)
                    n!=n*(n-1)!      (n>=1)
按照该公式可实现对阶乘的运算,由于该阶乘运算中存在终止条件“0!=1”,所以可以使用函数递归来实现该运算。

#function13.sh
#!/bin/bash

fact ()
{
    local num=$1
    
    if [ "$num" -eq 0 ]
    then
        factorial=1
    else
        let "decnum=num-1"

        fact $decnum

        let "factorial=$num * $?"
    fi
    return $factorial
}

fact $1
echo "Factorial of $1 is $?"

exit 0
请使用浏览器的分享功能分享到微信等