基本脚本函数

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. Service IntentService区别 (面试)

    依然记得自己当初没有真正的工作经验的时候的日子,满北京跑,没有人要.妈的,现在就想问,还有谁!想想真解气.不提了. 曾经有个面试官问我service 和IntentService的区别.当时自己模模糊 ...

  2. loj2058 「TJOI / HEOI2016」求和

    推柿子 第二类斯特林数的容斥表达 fft卡精度就用ntt吧qwq. #include <iostream> #include <cstdio> using namespace ...

  3. IOS开发---菜鸟学习之路--(十六)-将Image转换为Base64

    我们直接在.m文件的引用头文件部分 和 @interface   AddPictureViewController () 之间  加入 增加部分的代码 然后就可以使用图片转Base64了 #impor ...

  4. CSS视觉格式化模型

    CSS视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制.这是CSS 2.1的一个基础概念.视觉格式化模型根据CSS盒模型为文档的每个元素生成0 ...

  5. PHP 与 Redis 入门教程

    Redis 官方推荐的 PHP 客户端是 Predis 和 phpredis. 前者是完全使用 PHP 代码实现的原生客户端,而后者则是使用 C 语言编写的 PHP 扩展.在功能上两者区别并不大,就性 ...

  6. CSU-1908 The Big Escape

    CSU-1908 The Big Escape Description There is a tree-like prison. Expect the root node, each node has ...

  7. Visual C++斗地主游戏网络版源代码

    说明:VC++ 6.0写的网络版斗地主游戏,程序基于directx SDK开发,因此你在编译时需要引入相应文件才可以,本斗地主可以支持双人对战.网络对战,游戏随机产生地主,动画发牌,界面也不错,还有声 ...

  8. Leetcode 546.移除盒子

    移除盒子 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色.你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止.每一轮你可以移除具有相同颜色的连续 k 个盒子(k > ...

  9. Linux下librtmp使用及编程实战

    最近想做rtmp的推流.直播的小项目,不想直接使用FFmpeg进行推流,FFmpeg进行推流特别简单,因为它已经将编码以及librtmp都集成好了,没啥意思.FFmpeg推流的例子,在雷神的博客里可以 ...

  10. 学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用利用条件运算符的嵌套来完成此题:C表示。

    # -*- coding: utf8 -*- # Author:wxq #python 2.7 #题目:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用利用条件运算符 ...