shell编程入门--函数

函数的定义

和其他语言一样,在Shell语言中也有函数。尽管在Shell中函数并非是必须的编程元素,但是通过使用函数,可以对程序进行更加好的组织。将一些相对独立的代码变成函数,可以提高程序的可读性和重用性。避免重复编写大量相同的代码。

函数就是用户自己定义的程序集合,当我们在某个脚本中需要重复使用同一项功能时,就可以先把这项功能定义为一个函数,在每次使用时只要调用此函数即可,可以大大地简化程序代码。

函数 : 把一个功能封装起来,使用时直接调用函数名,这样的脚本好处:模块化,代码可读性强,扩展性方便

函数的语法如下:

方法1:
函数名( ) {
    函数体
    return n
}

方法2:
function 函数名( ) {
    函数体
    return n
}

 注:<1>函数不一定要在最开始定义,但是如果函数在定义前就使用,会报错

示例:

#!/bin/bash
count=1
echo "Before function definition"

function test1(){
  echo "test1"
}
while [ $count -le 3 ]
do
  test1                                       ##在定义函授test1后使用该函数
  count=$[ $count + 1 ]
done

test2                                         ##定义函数test2前使用该函数

function test2(){
   echo "test2"
}

 运行该脚本可以看出,程序在调用test2函数时报错,默认将test2当成一条命令执行

<2>函数名必须是唯一的,如果重新定义了函数,新的函数会覆盖旧的

示例:

#!/bin/bash
function fun1() {                 ##第一次定义fun1函数
   echo "first fun1"
}
fun1
function fun1() {                    ##重新定义了fun1函数
   echo "second fun1"      
}
fun1                                     ##调用该函数可以发现新的函数覆盖了旧的
function fun1() {
   echo "third fun1"
}
fun1

脚本的执行结果: 

[root@server day03]# sh function_02.sh
first fun1                     ##执行最初定义的函数内容
second fun1              ##执行第二次定义的函数内容
third fun1                   ##执行第三次定义的函数内容

函数的调用

当某个函数定义好了以后,用户就可以通过函数名来调用该函数了。在Shell中,函数调用的基本语法如下,

函数名   参数1   参数2 ....

注:

<1>每次调用函数时,bash回重新回到函数的定义

<2>可以传递参数,在函数中用$1,$2, $3...来引用传递的参数。

函数的返回值

1)默认退出状态码:默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码,可以通过$?来确定函数的退出状态

示例:<1>

#!/bin/bash

function fun1(){
   echo "trying to display a non-existent file"
   ls -l null &> /dev/null                    
}

echo "test the function:"
fun1
echo "The exit status is : $?"      ##这里输出的退出状态码是函数中最后一条命令ls -l null &> /dev/null 的退出状态

执行脚本:

[root@server day03]# sh exit_01.sh
test the function:
trying to display a non-existent file
The exit status is : 2             ##该文件不存在,最后一条命令ls -l null &> /dev/null退出状态不为0

示例:<2>

#!/bin/bash

function fun1(){
   ls -l null &> /dev/null
   echo "trying to display a non-existent file"         ##将该输出语句作为该函数的最后一条命令
}

echo "test the function:"
fun1
echo "The exit status is : $?"

执行该脚本:

[root@server day03]# sh exit_01.sh
test the function:
trying to display a non-existent file
The exit status is : 0                       ##最后一条命令echo "trying to display a non-existent file" 执行成功,退出状态不为0

2)使用return命令
shell使用return命令来退出函数并返回特定的退出状态码

但是 在Shell中,return语句只能返回某个0-255之间的整数值。如果超出这个范围就会返回错误的结果。

示例:

#!/bin/bash

function db1() {
    read -p "Enter a value:" value
    echo "doubling the value..."
    return $[ $value * 2 ]           ##通过return命令返回运算得到的结果值
}

db1

echo "The new value is $?"    ##此时输出的$?表示函数db1的返回值

运行该脚本:

[root@server day03]# sh return01.sh
Enter a value:24
doubling the value...
The new value is 48                                ##输出了输入值乘2的结果

函数返回值大于0-255,出错的情况:

[root@server day03]# sh return01.sh
Enter a value:300
doubling the value...
The new value is 88              ###正确的结果应该是600,但是函数的返回值是240.

3)函数使用echo返回值
将函数的输出保存在shell变量中,可以获得任何类型的函数输出,并将其保存到变量中

示例:

#!/bin/bash

function db1() {
    read -p "Enter a value:" value
    echo $[ $value * 2 ]         ##函数使用echo命令输出返回值
}

result=`db1`                ##将函数的输出值保存到result变量中
echo "The new value is $result"

运行脚本:

[root@server day03]# sh return02.sh
Enter a value:300
The new value is 600

函数中使用变量

可以向函数中传递参数

函数名会再$0变量中定义,函数命令行上的任何参数都会通过$1,$2...定义
$#来判断传给函数的参数数目

函数不能直接从命令行直接获取脚本的参数值,可以将命令行输入的参数传给变量再供函数使用

#!/bin/bash
a=$1
b=$2
function mul(){
    echo $[ a * b ]
}
if [ $# -eq 2 ];then
    result=`mul`
    echo "The result is $result"
else
    echo "Usage:$0 a b"
fi

执行脚本的结果:

也可以在调用函数时以命令行输入的变量为参数

functionname  $*

示例:

编写脚本,当函数的输入参数个数为1时,输出$1+$1的结果,当函数的输入参数个数为2时,输出$1+$2的结果,其余情况下军输出-1

#!/bin/bash
function addem(){
  if [ $# -eq 0 ] || [ $# -gt 2 ];then
      echo -1
  elif [ $# -eq 1 ];then
      echo $[ $1 + $1 ]
  else
      echo $[ $1 + $2 ]
  fi
}
result=`addem $*`
echo "The result is $result"

执行脚本的结果为:

变量的作用域

1)全局变量:在shell脚本内处处有效的变量。函数中定义全局变量,那么主代码中有效。主代码中定义全局,函数中也有效。
默认情况下,脚本中定义的变量都是全局变量。

示例:

#!/bin/bash
#testing the global variable
function fun(){
   value=$[ $value * 2 ]
}
read -p "Enter a value: " value
fun
echo "The new value is $value"

执行脚本:

[root@server day03]# sh global_variable.sh
Enter a value: 5
The new value is 10

由执行结果可以看出:输入5,得到10,这里的value在函数中发生变化了,到脚本中一样可以使用,而且已经变化了

2)局部变量:作用范围只在函数当中
定义方法: local value

示例<1>:

#!/bin/bash
#testing the global variable
function fun(){
  local value=$[ $value * 2 ]             ##在函数中定义局部变量value,作用域只在函数中
}
read -p "Enter a value: " value
fun
echo "The new value is $value"

执行脚本:

[root@server day03]# sh local_variable.sh
Enter a value: 5
The new value is 5

由执行结果可以看出:输入5,输出5。因为加上local关键字之后,函数中的value是局部变量,与外界无关

示例<2>:

#!/bin/bash
temp=4
value=6
function fun1(){
    local temp=$[ $value + 5 ]               ##temp变量的此运算只在函数中起作用
    result=$[ $temp * 2 ]
}
fun1
echo "The result is $result"
if [ $temp -gt $value ];then
    echo "temp is larger"
else
    echo "temp is smaller"
fi

执行脚本:

[root@server day03]# sh overall_01.sh
The result is 22
temp is smaller        ##将temp=4与value=6进行比较的结果

函数递归

练习:计算阶乘

<1>for循环实现阶乘

#!/bin/bash
read -p "Please input a number: " num
result=1
for i in `seq $num`
do
   result=$[ $result * $i ]
done
echo "The jc of $num is: $result"

执行脚本的结果:

<2>递归实现阶乘

#!/bin/bash
function jc(){
  if [ $1 == 0 ] || [ $1 == 1 ];then
    echo 1
  else
    local temp=$[ $1 - 1 ]
    local result=`jc $temp`
    echo $[ $result * $1 ]
  fi
}
read -p "Please enter a value: " value
result=`jc $value`
echo "The jc of $value is: $result"

运行脚本的结果如下:

猜你喜欢

转载自blog.csdn.net/weixin_40172997/article/details/85610445