基本脚本函数

1、创建函数

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

    function name {
commands
}

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

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

    name(){
conmmands
}

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

2、使用函数

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

[root@node1 ljy]# more ceshi.sh
#!/bin/bash
function func1 {
echo "hello everyone!"
}
count=1
while [ $count -le 5 ]
do
func1
count=$[ $count + 1 ]
done
[root@node1 ljy]# sh ceshi.sh
hello everyone!
hello everyone!
hello everyone!
hello everyone!
hello everyone!

返回值

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

1、默认退出状态码

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

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

2、使用return命令

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

[root@node1 ljy]# more ceshi.sh
#!/bin/bash
function db1 {
read -p "enter your value:" value
echo "doubling the value"
return $[ $value * 2 ]
}
db1
echo "the new value is $?"
[root@node1 ljy]# sh ceshi.sh
enter your value:3
doubling the value
the new value is 6

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

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

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

3、使用函数输出

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

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

在函数中使用变量

像函数传递参数

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

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

[root@node1 ljy]# more ceshi.sh
#!/bin/bash
function addem {
if [ $# -eq 0 ] || [ $# -gt 2 ]
then
echo "-1"
elif [ $# -eq 1 ]
then
echo $[ $1 + $1 ]
else
echo $[ $1 + $2 ]
fi
}
echo -n "adding 10 and 5: "
value=$(addem 10 5)
echo $value
[root@node1 ljy]# sh ceshi.sh
adding 10 and 5: 15

也可以这么玩

[root@node1 ljy]# more ceshi.sh
#!/bin/bash
function addem {
if [ $# -eq 0 ] || [ $# -gt 2 ]
then
echo "-1"
elif [ $# -eq 1 ]
then
echo $[ $1 + $1 ]
else
echo $[ $1 + $2 ]
fi
}
echo -n "the result is: "
value=$(addem $1 $2)
echo $value
[root@node1 ljy]# sh ceshi.sh 1 2
the result is: 3

在函数中处理变量

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

1、全局变量

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

[root@node1 ljy]# more ceshi.sh
#!/bin/bash
function func1 {
temp=$[ $value + 5 ]
value=$[ $temp + 1 ] }
temp=2
value=3 func1 echo -n "temp is : "
echo $temp
echo -n "value is : "
echo $value
[root@node1 ljy]# sh ceshi.sh
temp is : 8
value is : 9

temp的数据就受到了影响。

2、局部变量

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

[root@node1 ljy]# more ceshi.sh
#!/bin/bash
function func1 {
local temp=$[ $value + 5 ]
value=$[ $temp + 1 ] }
temp=2
value=3 func1 echo -n "temp is : "
echo $temp
echo -n "value is : "
echo $value
[root@node1 ljy]# sh ceshi.sh
temp is : 2
value is : 9

函数递归

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

[root@node1 ljy]# more ceshi.sh
#!/bin/bash
function func1 {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1 - 1 ]
local result=$(func1 $temp)
echo $[ $result * $1 ]
fi
}
read -p "enter value: " value
result=$(func1 $value)
echo "the factorial 0f $value is : $result"
[root@node1 ljy]# sh ceshi.sh
enter value: 5
the factorial 0f 5 is : 120

创建库

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

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

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

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

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

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

. ./name

在命令行上使用函数

在命令行上创建函数

有两种方法:

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

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

退出当前终端失效。

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

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

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

在.bashrc文件中定义函数

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

1.直接定义函数

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

[root@node1 ~]# more .bashrc
# .bashrc # User specific aliases and functions alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i' # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
#a test function
function func1 {
echo $[ $1 + $2 ]
}
[root@node1 ~]# func1 2 3
5

2.读取函数文件

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

[root@node1 ~]# more .bashrc
# .bashrc # User specific aliases and functions alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i' # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
#a test function
. /ljy/myfuncs
[root@node1 ~]# more /ljy/myfuncs
function addem {
echo $[ $1 + $2 ]
}
[root@node1 ~]# addem 1 3
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. Python 性能分析工具简介

    Table of Contents 1. 性能分析和调优工具简介 1.1. Context Manager 1.2. Decorator 1.3. 系统自带的time命令 1.4. python ti ...

  2. Python框架之Django学习笔记(一)

    Django历史: Django 是从真实世界的应用中成长起来的,它是由 堪萨斯(Kansas)州 Lawrence 城中的一个 网络开发小组编写的. 它诞生于 2003 年秋天,那时 Lawrenc ...

  3. 【Add Two Numbers】

    题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...

  4. TortoiseSVN 同时检索多人的提交日志记录(如图操作)

  5. IOS开发学习笔记038-autolayout 自动布局 界面实现

    在storyboard/xib文件中实现自动布局 autolayout 1.注意事项 autolayout和frame属性是有冲突的,所以如果准备使用autolayout,就不要再代码中对控件的fra ...

  6. c++面试须知

    这些都是从zhihu上看到的. 指针,多态(虚函数表.内存layout),作用域,内存的管理 算法与数据结构,数据结构上由掌握哈希.优先级队列,算法上有字符串处理,简单的DFS.BFS.动态规划 系统 ...

  7. DNS(转载)

    最近帮朋友注册域名配置主机,碰到一些DNS上的一些概念,惭愧于有一些东西已经忘记是啥意思,于是决定重新学习一下DNS方面的基本概念. 常用概念: TTL: TTL为Time to live的缩写,网络 ...

  8. js验证密码强弱

    JS密码强度验证 <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  9. 【转】Unity3D学习日记(一)使用UGUI制作虚拟摇杆

    http://blog.csdn.net/begonia__z/article/details/51170059 如今手机游戏玩法多种多样,尤其使用虚拟摇杆进行格斗类游戏开发或者是MMORPG成为了主 ...

  10. POJ 3368:Frequent values(线段树区间合并)

    题目大意,给出一段非降序列,求一些区间中出现频率最高的数的出现次数. 分析: 显然,区间中一个数多次出现必然是连续的,也就是最长的连续相等的一段. 用线段树解决,维护三个信息:一个区间最长连续的区间的 ...