基本脚本函数

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. 4 Template层-验证码

    1.验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力 使用验证码也是一种有效的防止crsf的方法 验证码效果如下图: 官网 ...

  2. 2017腾讯Web前端实习生招聘笔试题总结

    指针与引用的区别 考察margin塌陷 考察C++继承和~符号 考察TCP通讯过程 位码 三次握手 为什么不是两次握手 为什么不是四次握手 四次挥手 为什么要四次握手 TCP的状态 考察严格模式 进程 ...

  3. centos开机启动项设置命令:chkconfig

    在CentOS或者RedHat其他系统下,如果是后面安装的服务,如httpd.mysqld.postfix等,安装后系统默认不会自动启动的.就算手动执行/etc/init.d/mysqld start ...

  4. Leetcode 594.最长和谐子序列

    最长和谐子序列 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1. 现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3,2,2,5 ...

  5. 遇到的python3 不兼容 python2的地方

    python3中执行以下代码 >>> import subprocess >>> p=subprocess.Popen('ls',shell=True,stdout ...

  6. java的ArrayList使用方法详解

    ArrayList是Java的链表类,在项目开发中十分常见,那么怎样对ArrayList进行添加.删除.修改.查询.遍历呢?本文将进行详细阐述. 工具/原料   java 一.ArrayList的添加 ...

  7. 【翻译】Apache软件基金会1

    最近有点看不进去书,所以就找点东西翻译下,正好很想了解Apache基金会都有什么开源项目,每天找点事时间翻译翻译,还可以扩展下视野. 今天就看了两个,第一个是关于.NET的,不再兴趣范围内.第二个还挺 ...

  8. [CQOI2016][bzoj4519] 不同的最小割 [最小割树]

    题面 传送门 思路 首先我们明确一点:这道题不是让你把$n^2$个最小割跑一遍[废话] 但是最小割过程是必要的,因为最小割并没有别的效率更高的算法(Stoer-Wagner之类的?) 那我们就要尽量找 ...

  9. 现代互联网的TCP拥塞控制(CC)算法评谈

    动机 写这篇文章本质上的动机是因为前天发了一个朋友圈,见最后的写在最后,但实际上,我早就想总结总结TCP拥塞控制算法点点滴滴了,上周总结了一张图,这周接着那些,写点文字. 前些天,Linux中国微信公 ...

  10. script error总结

    移动端的页面在控制台报出一个script error,通常的原因有一下几点: 1. 脚本引入错误 可能是脚本的地址不对,协议不对(http或https问题),本地host文件绑定的地址不对 2. 方法 ...