Linux-函数-小节
来源:互联网 发布:suse yum源配置 编辑:程序博客网 时间:2024/05/22 15:45
基础篇
- - 概念
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/bashfunction factorial{factorial=1for (( i=1;i <= $1;i++ )) do factorial=$[ $factorial * $i ] doneecho $1的阶乘是:$factorial}echo '程序名':$0,用于求阶乘factorial $1[~/shell/function]# ./factorial.sh 10
程序名:./factorial.sh,用于求阶乘 10的阶乘是:3628800
2.返回值
函数返回码是指函数最后一条命令的状态码,可以用于函数返回值 使用return命令手动指定返回值:
代码如下:
[~/shell/function]# cat return.sh #!/bin/bashfunction fun1 { read -p "enter a: " a echo -n "print 2a: " return $[ $a * 2 ]}fun1echo "return value $?"[~/shell/function]# ./return.sh enter a: 100print 2a: return value 200
由于shell状态码最大是255,所以当返回值大于255时会出错。
代码如下:
[~/shell/function]# ./return.sh enter a: 200print 2a: return value 144
3.函数输出
为了返回大于255的数、浮点数和字符串值,最好用函数输出到变量:
代码如下:
[~/shell/function]# cat ./fun_out.sh #!/bin/bashfunction 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: 400return value print 2a: 800
4.向函数传递参数(使用位置参数):
代码如下:
[~/shell/function]# cat ./parameter.sh #!/bin/bashif [ $# -ne 3 ]then echo "usage: $0 a b c" exitfifun3() { echo $[ $1 * $2 * $3 ]}result=`fun3 $1 $2 $3`echo the result is $result[~/shell/function]# ./parameter.sh 1 2 3the result is 6[~/shell/function]# ./parameter.sh 1 2usage: ./parameter.sh a b c
5.全局变量与局部变量
默认条件下,在函数和shell主体中建立的变量都是全局变量,可以相互引用,当shell主体部分与函数部分拥有名字相同的变量时,可能会相互影响,例如:
代码如下:
[~/shell/function]# cat ./variable.sh #!/bin/bashif [ $# -ne 3 ]then echo "usage: $0 a b c" exitfitemp=5value=6echo temp is: $tempecho value is: $valuefun3() { temp=`echo "scale=3;$1*$2*$3" | bc -ql` result=$temp}fun3 $1 $2 $3echo "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 2temp is: 5value is: 6the result is 72temp is larger
在这种情况下,在函数内部最好使用局部变量,消除影响。
代码如下:
[~/shell/function]# cat ./variable.sh #!/bin/bashif [ $# -ne 3 ]then echo "usage: $0 a b c" exitfitemp=5value=6echo temp is: $tempecho value is: $valuefun3() { local temp=`echo "scale=3;$1*$2*$3" | bc -ql` result=$temp}fun3 $1 $2 $3echo "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 2temp is: 5value is: 6the result is 72temp is still smaller
6.向函数传递数组变量:
代码如下:
[~/shell/function]# cat array.sh #!/bin/basha=(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 15parameters : 11 12 13 14 15360360
7.函数返回数组变量
代码如下:
[~/shell/function]# cat array1.sh #!/bin/basha=(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
- Linux-函数-小节
- **awk内置函数小节**
- js函数知识小节
- Linux下命令小节
- Linux常用命令小节
- 关于sleep函数的小节
- 前端return false 函数 小节
- linux内部指令知识点小节
- 小节
- 小节
- u cos 延时函数用法小节
- linux学习教程(六) 命令技巧小节
- 8.8小节 函数作用域和闭包
- VB学习要点2----VB常用函数小节
- Linux下的C开发环境搭建小节
- 学习小节
- JSP小节
- 一个小节
- select下拉菜单与button的互动选择
- OC : NSException (崩溃)
- mybatis的jdbctype映射问题
- 第四十一篇: JAVA读取图像metadata信息
- IAR常见段名含义
- Linux-函数-小节
- 免费使用的pdf转cad软件使用
- dom4j解析xml字符串实例
- Linux ES集群服务配置说明
- HBase CURD之Delete
- JSP九大内置对象(三)
- Java后台手机号查看归属地
- 最大子数组
- 父子类初始化顺序及方法调用