Shell学习高级编程之函数

Posted wu6660563

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell学习高级编程之函数相关的知识,希望对你有一定的参考价值。

函数

无参无返回值函数

下面编写一个无参数无返回值的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 
$ 

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

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

以上是关于Shell学习高级编程之函数的主要内容,如果未能解决你的问题,请参考以下文章

跟着360架构师 学习Shell脚本编程

跟着360架构师 学习Shell脚本编程 完整版

Linux学习笔记之shell编程基础

shell学习

Python 高级教程之函数式编程

Linux——高级编程之概要