基础篇
- - 概念
a、由若干条shell 命令组成的语句块,实现代码重用和模块化编程
b、它与shell 程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell 程序的一部分
c、函数和shell 程序比较相似,区别在于:
①Shell 程序在子Shell 中运行
②而Shell 函数在 当前Shell 中运行。因此在当前Shell 中,函数可以对shell 中变量进行修改。
- - 自己的理解
a、我的理解来说就是:相当于一个定义了的变量,变量只有在被调用时才能突显出它的作用,平时是看不出来它的作用,只有被调用的时候才能突显出它的作用。函数也是一样。
b、函数是和shell平级的,地位一样,它可以改变shell脚本中的变量数据,在进程树里面它就是和shell是一个,在一个进程里面,就是shell的一部分,就是shell代码的一部分。
- - 定义函数
函数由两部分组成:函数名和函数 体 命令行输入:help function
语法一:
function f_name {
... 函数体...
}
语法二:
function f_name (){
... 函数体...
}
语法三:
f_name (){
... 函数体...
}
一般用第三种,比较省事, eg:test1 (){ echo test1 ; } 或者 调用的话直接在命令行输入你自己定义的函数名即可:
eg:test1 结果:test1
- - 注意:
a、定义的别名和函数名一样,别名在 。
b、如果函数和别名都定义一样的名字,别名会优先于函数。c、别名一般在交互环境使用,即命令行;函数一般使用环境是在脚本中,别名在脚本中一般是不生效的,所以在脚本中可以放心大胆的使用函数。
d、函数先声明再调用。
- - 函数常用命令有:
①、declare –f —————查看函数
查看自己定义的函数,如:declare –f | grep –A10 函数名 可以用grep命令查找
②、unset 函数名————删除函数和删除变量一样
③、还有三种定义函数的命令,上面已经总结。
④、local ————-—— 使函数中的变量只在函数中生效。
因为shell在调用函数的时候,函数和shell是平级的关系,所以变量也是会影响脚本的。在函数中定义变量前加上local 可以让变量只在函数中生效,而不会影响到脚本的变量。
·
⑤、declare –i 是定义整数变量的,但是在函数中使用,它相当于local,此时的函数的变量是局部的变量,不受到外面的变量的影响。
但是如果是想变成全局变量,可以 declare –ig,此时函数的变量可以被全局变量改变。
- - 调用函数
①、一般把函数放在单独的一个文件中,调用的时候在脚本中直接调用。 系统函数的在/etc/init.d/functions 这个文件中。
在脚本中用 source 或者 . 来调用,记得加上路径。
上述调用了系统函数action 查看系统函数可以用:cat /etc/init.d/functions 系统的函数很多而 action
这个函数是打印如图效果的。字符后面跟成功或者失败的字样。②有时候发现没有调用函数在脚本中不能使用,可以用:declare -xf 函数名
,因为函数在shell中无法在将父进程的函数传给子进程,如果要给子进程就使用上述命令。
- - 综合使用
①删除shell 函数
unset 函数名②用函数返回一个值 在普通定义函数的函数体前加一个 return
注意:如果函数函数体后面是命令需要加上反向单引号,因为它就是命令,返回的值在$?里面。
调用函数要使之生效,source 或者 . 生效函数。
exit是不能在函数使用的,它会直接退出调用它的脚本。
eg:
[root~]#cmd1 () { return `sed -r 's/.* ([0-9])\..*/\1/' /etc/centos-release` ; }
[root~]#. /etc/init.d/functions
[root~]#cmd1;[ $? == 7 ] && echo CentsOS 7
执行结果为:
CentsOS 7
③函数也可以加参数来处理 建立一个文件,编写
func () {
echo func:1st is $1
echo func:2st is $2
echo func:all arg number is $*
echo func:the arg number is $#
}
func $1 $2 $3
参数可以自己输入
升级篇
Shell函数的7种用法介绍
摘自脚本之家
这篇文章主要介绍了Shell函数的7种用法介绍,本文讲解了在shell文件内部定义函数并引用、返回值、函数输出、向函数传递参数、全局变量与局部变量等内容,需要的朋友可以参考下
1. 在shell文件内部定义函数并引用:
代码如下:
[~/shell/function]# cat factorial.sh
#!/bin/bash
function factorial
{
factorial=1
for (( i=1;i <= $1;i++ ))
do
factorial=$[ $factorial * $i ]
done
echo $1的阶乘是:$factorial
}
echo '程序名':$0,用于求阶乘
factorial $1
[~/shell/function]# ./factorial.sh 10
程序名:./factorial.sh,用于求阶乘 10的阶乘是:3628800
2.返回值
函数返回码是指函数最后一条命令的状态码,可以用于函数返回值 使用return命令手动指定返回值:
代码如下:
[~/shell/function]# cat return.sh
#!/bin/bash
function fun1 {
read -p "enter a: " a
echo -n "print 2a: "
return $[ $a * 2 ]
}
fun1
echo "return value $?"
[~/shell/function]# ./return.sh
enter a: 100
print 2a: return value 200
由于shell状态码最大是255,所以当返回值大于255时会出错。
代码如下:
[~/shell/function]# ./return.sh
enter a: 200
print 2a: return value 144
3.函数输出
为了返回大于255的数、浮点数和字符串值,最好用函数输出到变量:
代码如下:
[~/shell/function]# cat ./fun_out.sh
#!/bin/bash
function fun2 {
read -p "enter a: " a
echo -n "print 2a: "
echo $[ $a * 2 ]
}
result=`fun2`
echo "return value $result"
[~/shell/function]# ./fun_out.sh
enter a: 400
return value print 2a: 800
4.向函数传递参数(使用位置参数):
代码如下:
[~/shell/function]# cat ./parameter.sh
#!/bin/bash
if [ $# -ne 3 ]
then
echo "usage: $0 a b c"
exit
fi
fun3() {
echo $[ $1 * $2 * $3 ]
}
result=`fun3 $1 $2 $3`
echo the result is $result
[~/shell/function]# ./parameter.sh 1 2 3
the result is 6
[~/shell/function]# ./parameter.sh 1 2
usage: ./parameter.sh a b c
5.全局变量与局部变量
默认条件下,在函数和shell主体中建立的变量都是全局变量,可以相互引用,当shell主体部分与函数部分拥有名字相同的变量时,可能会相互影响,例如:
代码如下:
[~/shell/function]# cat ./variable.sh
#!/bin/bash
if [ $# -ne 3 ]
then
echo "usage: $0 a b c"
exit
fi
temp=5
value=6
echo temp is: $temp
echo value is: $value
fun3() {
temp=`echo "scale=3;$1*$2*$3" | bc -ql`
result=$temp
}
fun3 $1 $2 $3
echo "the result is $result"
if [ `echo "$temp > $value" | bc -ql` -ne 0 ]
then
echo "temp is larger"
else
echo "temp is still smaller"
fi
[~/shell/function]# ./variable.sh 12 3 2
temp is: 5
value is: 6
the result is 72
temp is larger
在这种情况下,在函数内部最好使用局部变量,消除影响。
代码如下:
[~/shell/function]# cat ./variable.sh
#!/bin/bash
if [ $# -ne 3 ]
then
echo "usage: $0 a b c"
exit
fi
temp=5
value=6
echo temp is: $temp
echo value is: $value
fun3() {
local temp=`echo "scale=3;$1*$2*$3" | bc -ql`
result=$temp
}
fun3 $1 $2 $3
echo "the result is $result"
if [ `echo "$temp > $value" | bc -ql` -ne 0 ]
then
echo "temp is larger"
else
echo "temp is still smaller"
fi
[~/shell/function]# ./variable.sh 12 3 2
temp is: 5
value is: 6
the result is 72
temp is still smaller
6.向函数传递数组变量:
代码如下:
[~/shell/function]# cat array.sh
#!/bin/bash
a=(11 12 13 14 15)
echo ${a[*]}
function array(){
echo parameters : "$@"
local factorial=1
for value in "$@"
do
factorial=$[ $factorial * $value ]
done
echo $factorial
}
array ${a[*]}
[~/shell/function]# ./array.sh
11 12 13 14 15
parameters : 11 12 13 14 15
360360
7.函数返回数组变量
代码如下:
[~/shell/function]# cat array1.sh
#!/bin/bash
a=(11 12 13 14 15)
function array(){
echo parameters : "$@"
local newarray=(`echo "$@"`)
local element="$#"
local i
for (( i = 0; i < $element; i++ ))
{
newarray[$i]=$[ ${newarray[$i]} * 2 ]
}
echo new value:${newarray[*]}
}
result=`array ${a[*]}`
echo ${result[*]}
[~/shell/function]# ./array1.sh
parameters : 11 12 13 14 15 new value:22 24 26 28 30