shell高级-----创建函数
基本脚本函数
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高级-----创建函数的更多相关文章
- Shell编程—创建函数
1基本的脚本函数 函数是一个脚本代码块,你可以为其命名并在代码中任何位置重用.要在脚本中使用该代码块时,只要使用所起的函数名就行了. 1.1创建函数 有两种格式可以用来在bash shell脚本中创建 ...
- 《Linux命令行与shell脚本编程大全》第十七章 创建函数
可以将shell脚本代码放进函数中封装起来,这样就能在脚本中的任何地方多次使用它了. 17.1 基本的脚本函数 函数:是一个脚本代码块,可以为其命名并在代码中任何位置重用. 17.1.1 创建函数 有 ...
- MySql创建函数与过程,触发器, shell脚本与sql的相互调用。
一:函数 1:创建数据库和表deptartment, mysql> use DBSC; Database changed mysql), ), )); Query OK, rows affect ...
- bash shell笔记7 创建函数
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/525126 知 ...
- JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链
继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...
- Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程
Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...
- 跟着老男孩一步步学习Shell高级编程实战
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1264627 本sh ...
- (转)跟着老男孩一步步学习Shell高级编程实战
原文:http://oldboy.blog.51cto.com/2561410/1264627/ 跟着老男孩一步步学习Shell高级编程实战 原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ...
- python高级之函数
python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...
随机推荐
- 笔记-http-header
笔记-http-header 1. Requests部分 Host:请求的web服务器域名地址 User-Agent:HTTP客户端运行的浏览器类型的详细信息.通过该头部信息,web服务器可 ...
- windows server 2008解决无法PING通问题
今天安装服务器(server 2008),配置完IP地址后,发现局域网其它电脑无法PING通服务器,测线仪测试链路都正常,网线接别的电脑也正常,以为是网卡问题,于是ping了自己的IP,发现能PING ...
- P3376 【模板】网络最大流dinic算法
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...
- cf984e Elevator
ref我好菜啊 #include <iostream> #include <cstring> #include <cstdio> #include <cmat ...
- MongoDB快速入门学习笔记3 MongoDB的文档插入操作
1.文档的数据存储格式为BSON,类似于JSON.MongoDB插入数据时会检验数据中是否有“_id”,如果没有会自动生成.shell操作有insert和save两种方法.当插入一条数据有“_id”值 ...
- Wordpress 自定义文章类型添加 Categoried、Tags
默认情况下 ,自定义文章类型没有分类和标签属性,需要通过 register_taxonomy_for_object_type 手动注册文章分类和标签,可以通过在 functions.php 或插件中添 ...
- Composer 下载安装类库
安装 Composer 你需要先下载 composer.phar 可执行文件. curl -sS https://getcomposer.org/installer | php composer.js ...
- html之表单标签
表单标签的属性: 用于向服务器传输数据 表单能够包含input元素,比如文本字段,复选框,单选框,提交按钮等等 表单还可以包含textarea(简介之类的),select(下拉),fieldset和l ...
- 求解Catalan数,(大数相乘,大数相除,大数相加)
Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜 ...
- 关于JavaWeb开发的一些感悟
从事JavaWeb的开发已经三年了,从最开始的啥都不会,到慢慢的能够独立做项目,从一开始的一片茫然,到现在的心中有数.对于技术.业务也有了自己的看法. JavaWeb开发所涉及到的知识点非常多,涉及到 ...