Shell学习(二)高级编程之函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wu6660563/article/details/85167157

函数

无参无返回值函数

下面编写一个无参数无返回值的Shell函数

#!/bin/bash 
# author:Nickwu
# date:2018-12-14
# fileName : test.sh
function func1 { 
 echo "This is an example of a function" 
} 
# 使用函数,直接调用函数名即可
func1 

将文件授权可执行chmod u+x test.sh,通过./test.sh执行,返回如下:

This is an example of a function

如上所示,要使用函数,直接函数名即可

返回值

如下例子,构建一个函数,输入一个数字,将会返回这个数字的两倍

#!/bin/bash 
# author:Nickwu
# date:2018-12-14
# fileName : test.sh
function dbl { 
 read -p "Enter a value: " value 
 echo $[ $value * 2 ] 
} 
result=$(dbl) 
echo "The new value is $result" 

执行结果如下:

$ ./test.sh
Enter a value: 20
The new value is 40

当输入的是英文的时候,返回值会变成0

有参数函数

#!/bin/bash 
# author:Nickwu
# date:2018-12-14
# fileName : test.sh
function addem { 
	# $#表示参数个数,如果参数的个数等于0或者大于2,返回-1
    if [ $# -eq 0 ] || [ $# -gt 2 ] 
    then 
        echo -1 
    # 如果参数的个数等于0,直接2倍
    elif [ $# -eq 1 ] 
    then 
        echo $[ $1 * 2 ] 
    else 
        echo $[ $1 + $2 ] 
    fi 
}
value=$(addem 10 15) 
echo $value 
  • 全局变量
    在参数传递中,定义的变量默认是全局变量,如下:
#!/bin/bash 
# author:Nickwu
# date:2018-12-14
# fileName : test.sh
function dbl { 
    value=$[ $value * 2 ] 
} 
read -p "Enter a value: " value 
dbl 
echo "The new value is: $value" 

$value变量在函数外定义并被赋值。当dbl函数被调用时,该变量及其值在函数中都依然有效。如果变量在函数内被赋予了新值,那么在脚本中引用该变量时,新值也依然有效。但这其实很危险,尤其是如果你想在不同的shell脚本中使用函数的话。它要求你清清楚楚地知道函数中具体使用了哪些变量,包括那些用来计算非返回值的变量。

  • 局部变量
    为了解决这个问题,shell引入了局部变量,无需在函数中使用全局变量,函数内部使用的任何变量都可以被声明成局部变量。要实现这一点,只要在变量声明的前面加上local关键字就可以了。
# 在变量赋值语句中使用local关键字,local关键字保证了变量只局限在该函数中。
local temp=$[ $value + 5 ] 

数组参数

function testit { 
    local newarray 
    newarray=(;'echo "$@"') 
    echo "The new array value is: ${newarray[*]}" 
} 
myarray=(1 2 3 4 5) 
echo "The original array is ${myarray[*]}" 
testit ${myarray[*]}

执行结果如下:

The original array is 1 2 3 4 5 
The new array value is: 1 2 3 4 5 

返回数组

function arraydblr { 
    local origarray 
    local newarray 
    local elements 
    local i 
    origarray=($(echo "$@")) 
    newarray=($(echo "$@")) 
    elements=$[ $# - 1 ] 
    for (( i = 0; i <= $elements; i++ )) 
    { 
        newarray[$i]=$[ ${origarray[$i]} * 2 ] 
    } 
    echo ${newarray[*]} 
}
myarray=(1 2 3 4 5) 
echo "The original array is: ${myarray[*]}" 
arg1=$(echo ${myarray[*]}) 
result=($(arraydblr $arg1)) 
echo "The new array is: ${result[*]}"

执行结果如下:

The original array is: 1 2 3 4 5 
The new array is: 2 4 6 8 10 

递归函数

调用函数为$(functionName $value),如果是递归调用,跟普通调用是一样的

创建库

# fileName : myFunction
function addem { 
    echo $[ $1 + $2 ] 
} 
function multem { 
    echo $[ $1 * $2 ] 
} 
function divem { 
    if [ $2 -ne 0 ] 
    then 
        echo $[ $1 / $2 ] 
    else 
    echo -1 
    fi 
} 

调用为. ./myfuncs,即一个点号,然后空格,文件路径即可

在命令行创建库

$ function add { echo $[ $1 + $2 ]; } 
$ add 10 5 
15

可以通过换行的方式

$ function multem { 
> echo $[ $1 * $2 ] 
> } 
$ multem 2 5 
10 
$ 

后面的花括号结尾回车的话,会自动识别你的函数结束了。

这种做法有个弊端,如果你的命名不规范,与系统命令冲突,将会覆盖系统命令,很不安全,也不提倡这种做法!!!

猜你喜欢

转载自blog.csdn.net/wu6660563/article/details/85167157
今日推荐