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.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...
随机推荐
- Diycode开源项目 UserActivity分析
1.效果预览 1.1.实际界面预览 1.2. 这是MainActivity中的代码 这里执行了跳转到自己的用户界面的功能. 1.3.点击头像或者用户名跳转到别人的页面 UserActivity的结构由 ...
- 设计模式之第21章-状态模式(Java实现)
设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...
- Python框架之Django学习笔记(六)
模板 上篇博文学习了动态视图,但是,视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python 代码之中. def current_datetime(request): now = ...
- maven学习(十一)——maven中的聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 <modules> <module>模块一</module> & ...
- Windows下Git多账号ssh-key(复制自己用)
Windows下Git多账号配置,同一电脑多个ssh-key的管理 这一篇文章是对上一篇文章<Git-TortoiseGit完整配置流程>的拓展,所以需要对上一篇文章有所了解,当然直接往下 ...
- nyoj 题目5 Binary String Matching
Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alp ...
- 【转】 [Unity3D]手机3D游戏开发:场景切换与数据存储(PlayerPrefs 类的介绍与使用)
http://blog.csdn.net/pleasecallmewhy/article/details/8543181 在Unity中的数据存储和iOS中字典的存储基本相同,是通过关键字实现数据存储 ...
- 【.NET MVC分页】.NET MVC 使用pagelist 分页
1.安装 2. 在NuGet程序包管理控制台 ,输入Install-Package PagedList.mvc 安装PagedList 和PageList.Mvc; 3. @{ Layout = nu ...
- jQuery操作DOM基础 - 创建节点
案例:创建两个<li>元素节点,并且作为<ul>元素节点的子节点,添加到DOM树中 <!DOCTYPE html> <html lang="en&q ...
- cmake导出的visual studio工程带头文件
file(GLOB_RECURSE CURRENT_HEADERS *.h *.hpp) 分组显示 source_group("Include" FILES ${CURRENT_H ...