基本脚本函数

1、创建函数

有两种格式可以用来在bash shell脚本中创建函数。
第一种采用关键字function。后跟分配给该代码的函数名。

  1. function name {
  2. commands
  3. }

name属性定义了赋予函数唯一的名称。脚本中定义的每个函数都必须有一个唯一的名称。
commands是构成函数的一条或多条bash shell命令。在调用该函数时,bash shell会按命令在函数中出现的顺序依次执行,就像在普通脚本中一样。

在bash shell脚本中定义函数的第二种格式更接近于其他编程语言中定义函数的方式。

  1. name(){
  2. conmmands
  3. }

函数名后的空括号表明正在定义的是一个函数。这种格式的命名规则和之前定义shell脚本函数的格式一样。

2、使用函数

要在脚本中使用函数,只需要向其他shell命令一样,在行中指定函数名就行。

  1. [root@node1 ljy]# more ceshi.sh
  2. #!/bin/bash
  3. function func1 {
  4. echo "hello everyone!"
  5. }
  6. count=1
  7. while [ $count -le 5 ]
  8. do
  9. func1
  10. count=$[ $count + 1 ]
  11. done
  12. [root@node1 ljy]# sh ceshi.sh
  13. hello everyone!
  14. hello everyone!
  15. hello everyone!
  16. hello everyone!
  17. hello everyone!

返回值

有3种不同的方法来为函数生成退出状态码。

1、默认退出状态码

默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。

如果之前命令有失败,但是最后一条命令是成功的,该函数的退出状态码也是0,所以使用默认退出状态码是很危险的。

2、使用return命令

return命令允许指定一个整数值来定义函数的退出状态码。

  1. [root@node1 ljy]# more ceshi.sh
  2. #!/bin/bash
  3. function db1 {
  4. read -p "enter your value:" value
  5. echo "doubling the value"
  6. return $[ $value * 2 ]
  7. }
  8. db1
  9. echo "the new value is $?"
  10. [root@node1 ljy]# sh ceshi.sh
  11. enter your value:3
  12. doubling the value
  13. the new value is 6

如果使用这种方式来获取返回码,需要注意

(1)函数一结束就取返回值。

(2)退出状态码必须是0~255

3、使用函数输出

可以将函数的结果输出保存在变量中。

  1. [root@node1 ljy]# more ceshi.sh
  2. #!/bin/bash
  3. function db1 {
  4. read -p "enter your value:" value
  5. echo $[ $value * 2 ]
  6. }
  7. result=$(db1)
  8. echo "the new value is $result"
  9. [root@node1 ljy]# sh ceshi.sh
  10. enter your value:2
  11. the new value is 4

在函数中使用变量

像函数传递参数

函数可以使用标准的参数环境变量来表示命令行上传给函数的参数。$#特殊变量表示传递给函数的参数个数。

在脚本中指定函数时,必须将函数和参数放在同一行:funcl $valu1 10

  1. [root@node1 ljy]# more ceshi.sh
  2. #!/bin/bash
  3. function addem {
  4. if [ $# -eq 0 ] || [ $# -gt 2 ]
  5. then
  6. echo "-1"
  7. elif [ $# -eq 1 ]
  8. then
  9. echo $[ $1 + $1 ]
  10. else
  11. echo $[ $1 + $2 ]
  12. fi
  13. }
  14. echo -n "adding 10 and 5: "
  15. value=$(addem 10 5)
  16. echo $value
  17. [root@node1 ljy]# sh ceshi.sh
  18. adding 10 and 5: 15

也可以这么玩

  1. [root@node1 ljy]# more ceshi.sh
  2. #!/bin/bash
  3. function addem {
  4. if [ $# -eq 0 ] || [ $# -gt 2 ]
  5. then
  6. echo "-1"
  7. elif [ $# -eq 1 ]
  8. then
  9. echo $[ $1 + $1 ]
  10. else
  11. echo $[ $1 + $2 ]
  12. fi
  13. }
  14. echo -n "the result is: "
  15. value=$(addem $1 $2)
  16. echo $value
  17. [root@node1 ljy]# sh ceshi.sh 1 2
  18. the result is: 3

在函数中处理变量

函数使用两种类型的变量,全局变量和局部变量

1、全局变量

默认情况下,你在脚本中定义的任何变量都是全局变量。

  1. [root@node1 ljy]# more ceshi.sh
  2. #!/bin/bash
  3. function func1 {
  4. temp=$[ $value + 5 ]
  5. value=$[ $temp + 1 ]
  6.  
  7. }
  8. temp=2
  9. value=3
  10.  
  11. func1
  12.  
  13. echo -n "temp is : "
  14. echo $temp
  15. echo -n "value is : "
  16. echo $value
  17. [root@node1 ljy]# sh ceshi.sh
  18. temp is : 8
  19. value is : 9

temp的数据就受到了影响。

2、局部变量

local 关键字保证了变量只局限在该函数中。

  1. [root@node1 ljy]# more ceshi.sh
  2. #!/bin/bash
  3. function func1 {
  4. local temp=$[ $value + 5 ]
  5. value=$[ $temp + 1 ]
  6.  
  7. }
  8. temp=2
  9. value=3
  10.  
  11. func1
  12.  
  13. echo -n "temp is : "
  14. echo $temp
  15. echo -n "value is : "
  16. echo $value
  17. [root@node1 ljy]# sh ceshi.sh
  18. temp is : 2
  19. value is : 9

函数递归

函数可以调用自己来得到结果。

  1. [root@node1 ljy]# more ceshi.sh
  2. #!/bin/bash
  3. function func1 {
  4. if [ $1 -eq 1 ]
  5. then
  6. echo 1
  7. else
  8. local temp=$[ $1 - 1 ]
  9. local result=$(func1 $temp)
  10. echo $[ $result * $1 ]
  11. fi
  12. }
  13. read -p "enter value: " value
  14. result=$(func1 $value)
  15. echo "the factorial 0f $value is : $result"
  16. [root@node1 ljy]# sh ceshi.sh
  17. enter value: 5
  18. the factorial 0f 5 is : 120

创建库

bash shell允许创建函数库文件,然后在多个脚本中引用该库文件。

1.创建一个包含脚本中所需函数的公用库文件

2.在用到这些函数的脚本文件中包含库文件名。

  1. [root@node1 ljy]# more myfuncs
  2. function addem {
  3. echo $[ $1 + $2 ]
  4. }
  5. [root@node1 ljy]# more ceshi.sh
  6. #!/bin/bash
  7. . ./myfuncs
  8. result=$(addem 1 2)
  9. echo "result is $result"
  10. [root@node1 ljy]# sh ceshi.sh
  11. result is 3

使用函数库的关键在于source命令。

source命令有个快捷的别名,叫做点操作符。

. ./name

在命令行上使用函数

在命令行上创建函数

有两种方法:

一、采用单行方式定义函数

  1. [root@node1 ljy]# function func1 { echo $[ $1 + $2 ]; }
  2. [root@node1 ljy]# func1 1 2
  3. 3

退出当前终端失效。

二、采用多行方式定义函数

  1. [root@node1 ~]# function func1 {
  2. > echo $[ $1 + $2 ]
  3. > }
  4. [root@node1 ~]# func1 1 3
  5. 4

在函数的尾部使用花括号,shell就会知道你完成了函数的定义。

在.bashrc文件中定义函数

为了防止每次退出shell后函数失效,可以将函数写在.bashrc文件。bash shell在每次启动时都会在主目录下查找这个文件。

1.直接定义函数

把你的函数直接写在文件末尾

  1. [root@node1 ~]# more .bashrc
  2. # .bashrc
  3.  
  4. # User specific aliases and functions
  5.  
  6. alias rm='rm -i'
  7. alias cp='cp -i'
  8. alias mv='mv -i'
  9.  
  10. # Source global definitions
  11. if [ -f /etc/bashrc ]; then
  12. . /etc/bashrc
  13. fi
  14. #a test function
  15. function func1 {
  16. echo $[ $1 + $2 ]
  17. }
  18. [root@node1 ~]# func1 2 3
  19. 5

2.读取函数文件

在shell脚本中可以用source命令将库文件的函数添加到你的.bashrc文件中

  1. [root@node1 ~]# more .bashrc
  2. # .bashrc
  3.  
  4. # User specific aliases and functions
  5.  
  6. alias rm='rm -i'
  7. alias cp='cp -i'
  8. alias mv='mv -i'
  9.  
  10. # Source global definitions
  11. if [ -f /etc/bashrc ]; then
  12. . /etc/bashrc
  13. fi
  14. #a test function
  15. . /ljy/myfuncs
  16. [root@node1 ~]# more /ljy/myfuncs
  17. function addem {
  18. echo $[ $1 + $2 ]
  19. }
  20. [root@node1 ~]# addem 1 3
  21. 4

shell高级-----创建函数的更多相关文章

  1. Shell编程—创建函数

    1基本的脚本函数 函数是一个脚本代码块,你可以为其命名并在代码中任何位置重用.要在脚本中使用该代码块时,只要使用所起的函数名就行了. 1.1创建函数 有两种格式可以用来在bash shell脚本中创建 ...

  2. 《Linux命令行与shell脚本编程大全》第十七章 创建函数

    可以将shell脚本代码放进函数中封装起来,这样就能在脚本中的任何地方多次使用它了. 17.1 基本的脚本函数 函数:是一个脚本代码块,可以为其命名并在代码中任何位置重用. 17.1.1 创建函数 有 ...

  3. MySql创建函数与过程,触发器, shell脚本与sql的相互调用。

    一:函数 1:创建数据库和表deptartment, mysql> use DBSC; Database changed mysql), ), )); Query OK, rows affect ...

  4. bash shell笔记7 创建函数

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/525126 知 ...

  5. JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链

    继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...

  6. Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程

    Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...

  7. 跟着老男孩一步步学习Shell高级编程实战

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1264627 本sh ...

  8. (转)跟着老男孩一步步学习Shell高级编程实战

    原文:http://oldboy.blog.51cto.com/2561410/1264627/  跟着老男孩一步步学习Shell高级编程实战 原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ...

  9. python高级之函数

    python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...

随机推荐

  1. 解决Uva网站打开慢的问题

    https://blog.csdn.net/richenyunqi/article/details/80990535

  2. 通过APP,网页打开手机客户端QQ

    以下内容为转载,原帖子 http://m.blog.csdn.net/blog/qduningning/40587099 在浏览器中可以通过JS代码打开QQ并弹出聊天界面,一般作为客服QQ使用.而在移 ...

  3. Git之2分钟教程

    Git之2分钟入门 普通人:“借我1000块钱”.程序猿:“借你1024吧,凑个整”. 今天是1024,是我们程序员的节日,在此,首先祝各位程序猿以及程序媛们节日快乐~然后送出一份节日礼物,没错,就是 ...

  4. 【Partition List】cpp

    题目: Given a linked list and a value x, partition it such that all nodes less than x come before node ...

  5. leetcode 【 Search in Rotated Sorted Array II 】python 实现

    题目: 与上一道题几乎相同:不同之处在于array中允许有重复元素:但题目要求也简单了,只要返回true or false http://www.cnblogs.com/xbf9xbf/p/42545 ...

  6. CMD 下运行python的unittest测试脚本无输出

    正常情况下windows的命令行执行python脚本命令: python 脚本名.py 我这样做了,看截图可以看到,并没有期待中那样有一堆高大上的信息输出,反而毛都没有!!!! 于是,我想起了度娘,但 ...

  7. Selenium - WebDriver: Waits

    These days most of the web apps are using AJAX techniques. When a page is loaded to browser, the ele ...

  8. Unity 查找

    GameObject.Find().Transform.Find查找游戏对象 1.前置条件 Unity中常用到查找对象,非隐藏的.隐藏的,各种方法性能有高有低,使用又有各种条件限制. 在此对查找的性能 ...

  9. C#中静态变量和 静态方法的作用

    1.静态变量 在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作用.但有些时候,这样做却不是个明智的选择. 假设我们要定义一个图书类,要求 ...

  10. col-md-push-*和col-md-offset的区别

    实现方式的区别:col-md-offset-*,是利用margin-left实现的,col-md-push-*/col-md-pull-*是利用相对定位实现的. 效果的区别,col-md-offset ...