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