Linux-函数-小节

基础篇

  • - 概念

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值