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学习高级编程之函数的主要内容,如果未能解决你的问题,请参考以下文章