本文主要讲解Shell脚本开发中函数的知识与实践

基本大纲:

1.Shell函数的概念与作用介绍

2.Shell函数的语法大全

3.Shell函数的执行

4.Shell函数的基础实践

5.Shell函数的企业级运用实践


一:Shell函数的概念与作用介绍

在讲解Shell函数之前,先回顾下Linux系统中别名的作用

[root@aliyun ~]# alias ng='/etc/init.d/nginx'        #单引号是保证原样输出

[root@aliyun ~]# ng restart        #执行ng就相当于执行/etc/init.d/nginx,最直接的好处就是简化了输入的,简单快捷

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

Stopping nginx:                                            [  OK  ]

Starting nginx:                                            [  OK  ]

函数也有类似于别名的作用,例如可简化程序的代码量,让程序更易读、易改、易用

简单的说,函数的作用就是将程序里多次被调用的相同代码组合起来(函数体),并为其取一个名字(即函数名),其他所有想重复调用这部分代码的地方都只需要调用这个名字就可以了。当需要修改这部分重复代码时,只需要改变函数体内的一份代码即可实现对所有调用的修改,也可以把函数独立地写到文件里,当需要调用函数时,再加载进来使用。

使用Shell函数的优势如下:

  • 把相同的程序段定义成函数,可以减少整个程序的代码量,提升开发效率

  • 增加程序的可读性、易读性,提升管理效率

  • 可以实现程序功能模块化,使得程序具备通用性(可移植性)


二:Shell函数的语法大全

下面是Shell函数的常见语法格式。

其标准写法为:

function 函数名 (){

指令...

return n

}

简化写法1:

function 函数名  {

指令...

return n

}

#在Shell函数的语法中,当有function时,函数名后面的小括号"()"部分可以省略不写。

简化写法2:

函数名 (){            #推荐使用这种写法来命名函数

指令...

return n

}

#在shell函数的语法中,function表示声明一个函数,这部分可以省略不写。


三:Shell函数的执行

Shell的函数分为最基本的函数和可以传参的函数两种,其执行方式分别说明如下。

1)执行不带参数的函数时,直接输入函数名即可(注意不带小括号)。格式如下:

函数名

有关执行函数的重要说明:

  • 执行Shell函数时,函数名前的function和函数后的小括号都不要带

  • 函数的定义必须在要执行的程序前面定义和加载

  • Shell执行系统中各种程序的执行顺序为:系统别名——函数——系统命令——可执行文件

  • 函数执行时,会和调用它的脚本共用变量,也可以为函数设定局部变量及特殊位置参数

  • 在Shell函数里面,return命令的功能与exit类似,return的作用是退出函数,而exit是退出脚本文件

  • return语句会返回一个退出值(即返回值)给调用函数的当前程序,而exit会返回一个退出值(即返回值)给执行程序的当前Shell

  • 如果将函数存放在独立的文件中,被脚本加载使用时,需要使用source或"."来加载

  • 在函数内容一般使用local定义局部变量,这些变量离开函数后就会消失

2)带参数的函数执行方法,格式如下:

函数名    参数1    参数2

函数后接参数的说明:

  • Shell的位置参数($1、$2...$#、$*、$?及$@)都可以作为函数的参数来使用

  • 此时父脚本的参数临时的被函数参数所掩盖或隐藏

  • $0比较特殊,它仍然是父脚本的名称

  • 当函数执行完成时,原来的命令行脚本的参数即可恢复

  • 函数的参数变量是在函数体里面定义的


四:Shell函数的基础实践

范例1:开发脚本建立两个简单函数并调用执行

[root@aliyun hs]# cat jdhs.sh
ywxi( ){echo "I am ywxi."
}ywxitest( ){echo "ywxi is test."
}
ywxi        #务必要先定义函数然后再执行函数,否则会报错
ywxitest
[root@aliyun hs]# sh jdhs.sh
I am ywxi.
ywxi is test.

范例2:分离函数体和执行函数的脚本文件(更规范的方法)

首先建立函数库脚本(默认不会执行函数)

使用cat命令追加多行文本,以将函数代码追加到系统的函数文件中,即/etc/init.d/functions ,命令如下:

[root@aliyun hs]# cat >>/etc/init.d/functions<<- EOF
> ywxi() {
>     echo "I am ywxi."
> }
> EOF
[root@aliyun hs]# tail -3 /etc/init.d/functions
ywxi() {echo "I am ywxi."
}[root@aliyun hs]# cat ceshi.sh
#提示:可以用source和.(点号)来加载脚本functions中的命令或变量参数等
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
#调用函数
ywxi[root@aliyun hs]# sh ceshi.sh
I am ywxi.

范例3:带参数的Shell函数示例

[root@aliyun hs]# tail -3 /etc/init.d/functions
ywxi() {echo "I am ywxi,you are $1"
}
[root@aliyun hs]# cat ceshi2.sh
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
ywxi xiaoming        #将xiaoming作为参数传给ywxi函数
[root@aliyun hs]# sh ceshi2.sh
I am ywxi,you are xiaoming        #由/etc/init.d/functions里的ywxi函数将xiaoming传给$1[root@aliyun hs]# tail -3 /etc/init.d/functions
ywxi() {echo "I am ywxi,you are $1"
}
[root@aliyun hs]# cat ceshi3.sh
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
ywxi $1        #这个$1本身是脚本的位置参数,但是$1占据的位置为函数的参数位置,现在他们重合了
[root@aliyun hs]# sh ceshi3.sh xiaoming    #传入xiaoming
I am ywxi,you are xiaoming

五:Shell函数的企业级运用实践

利用Shell函数开发企业级URL检测脚本

脚本示例如下:

[root@aliyun hs]# cat url.sh
#!/bin/bash
. /etc/init.d/functions         #引入系统函数库
function usage( ) {echo $"usage:$0 URL"exit 1
}
function check_url( ) {wget --spider -q -o /dev/null --tries=1 -T 5 $1if [ $? -eq 0 ]thenaction "$1 is success." /bin/true    #这里的action就是在脚本开头引入系统函数库后调用的elseaction "$1 is fail." /bin/falsefi
}
function main( ) {if [ $# -ne 1 ]thenusageficheck_url $1
}
main $*#脚本测试
[root@aliyun hs]# sh url.sh www.baidu.com
www.baidu.com is success.                                  [  OK  ]
[root@aliyun hs]# sh url.sh www.baisdu.com
www.baisdu.com is success.                                 [  OK  ]
[root@aliyun hs]# sh url.sh www.baiasdsdasdu.com
www.baiasdsdasdu.com is fail.                              [FAILED]

转载于:https://blog.51cto.com/13707680/2125349

Shell笔记5——函数的知识与实践相关推荐

  1. Linux Shell笔记2 函数

    shell执行函数时, 不单独创建子进程, 而是直接执行. 一般把函数写入单独的文件, 需要时进行调用. Linux执行命令时的查找顺序如图: 使用type命令进行分辨命令的类型, 比如type ls ...

  2. kotlin读书笔记之函数基本知识以及泛型

    1.函数内容 1.1 函数的声明与用法 kotlin的函数使用fun关键字声明,如下所示: fun double(x: Int): Int {return 2 * x } double(2).tost ...

  3. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

  4. Shell笔记9——Shell数组的应用实践

    本文主要讲解Shell脚本开发中数组的知识与实践 目录: 1.Shell数组介绍 2.Shell数组的定义与常用实践 3.Shell数组脚本开发实践 4.shell数组的重要命令 5.Shell数组相 ...

  5. Shell笔记8——for和select循环的应用实践

    本文主要讲解Shell脚本开发中for和select循环的知识与实践 目录: 1.for循环语法结构 2.for循环语句的基础实践 3.for循环语句的企业级案例 4.linux系统产生随机数的四种方 ...

  6. Shell脚本中函数返回值的用法笔记

    函数的返回值又可以称为函数的退出状态,实际上可以理解为一种通信方式.Shell脚本中函数可以使用返回值的方式把调用的结果信息反馈给调用者.便于调用者可以根据反馈的结果做相应处理. 说明:函数的返回值主 ...

  7. 小苏的Shell编程笔记之六--Shell中的函数

    http://xiaosu.blog.51cto.com/2914416/531247 Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以 ...

  8. MySQL 笔记6 -- 函数与事务

    MySQL 笔记6 – 函数与事务 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 SQL 教程 一.内置函数 ...

  9. ROS入门笔记(四):ROS实践(小海龟仿真)— ROS Topics

    ROS入门笔记(四):ROS实践(小海龟仿真)- ROS Topics 文章目录 1 基础知识 1.1 运行ROS Master所在主机的资源地址 1.2 ROS常用命令 1.2.1 查看所有以ros ...

  10. linux 数据处理软件,【shell笔记文本处理|专项】Linux数据文本处理工具(2)

    接1 file 查看文件编码 wsx@wsx-ubuntu:~$ file regular_express.txt regular_express.txt: ASCII text, with CRLF ...

最新文章

  1. flask之flask_socketio
  2. [笔记]filter,空字符,0,None都是False应用
  3. 阿里云 VPC 内网性能测试最佳实践
  4. CVPR 2019 行人检测新思路:高级语义特征检测取得精度新突破
  5. centos上mysql
  6. nodejs 最简单的文件接收
  7. finalshell远程安装oracle,安装oracle的问题
  8. 人手一份的Java面试精选题,你值得拥有!
  9. 软件项目开发文档 模板
  10. 饥荒联机版服务器控制台本地和在线,饥荒联机版控制台怎么打开_饥荒联机版控制台开启方法_牛游戏网...
  11. 2023-2028年中国硫氰酸钠市场发展动态及前景预测报告
  12. SSD: Single Shot MultiBox Detector 之再阅读
  13. Joel Spolsky给计算机专业学生的七个建议
  14. 做实验验证JDK8偏向锁:未启动、匿名偏向、偏向锁失效
  15. 基于spark的车辆分析
  16. 安卓中Paint类和Canvas类的方法汇总
  17. 6、API网关 Zuul
  18. JavaWeb实现登录验证码
  19. 250g硬盘linux分区,三星250G硬盘分区后的问题
  20. arduino控制声音传感器

热门文章

  1. mysql数字有效位_SQL Server实现数字转字符保留几位有效位数
  2. UIButton颜色渐变 titleLabel字体不显示
  3. Layer下拉框监听
  4. error: implicit declaration of function ‘RAND_egd’ [-Werror=implicit-function-declaration]
  5. 编程基本功:工作中,高低境界如何迁就?
  6. 打包deb时,实际上是两层包名目录的结构
  7. 放眼世界,一个人重整WP的整套代码,唯吾一人
  8. NPAPI最简单的代码
  9. 错误及原因推测:sysdeps/x86_64/multiarch/strstr-sse2-unaligned.S: 没有那个文件或目录
  10. ubuntu安装Nvidia-docker2详细步骤