近期在学习shell编程方面的知识,写的不怎么好,请大家多多指点,下面给大家分享一下shell函数的用法。

我们为什么要用shell函数?

  简单的说,函数的作用就是把程序多次调用相同的代码部分定义成一份,然后为这一份代码定义一个名字,其它所有重复调用这部分代码就都只调用定义的这个名字就OK了,当需要修改这部分重复代码时,只需要修改函数体内的一部分代码即可实现所有调用修改。

使用函数的优势:

①把相同的程序定义成函数,可以减少整个程序的代码量

②增加程序的可读性、异读性,以及可管理性。

③可以实现程序功能模块化,不同的程序使用函数模块化。

shell函数的语法:

 shell函数语法
函数名()
{
指令...
return n
}

function 函数名() #funcation 表示定义一个函数
{
指令...
return n #输出返回值
}

说明:shell的返回值是用exit输出返回值,而函数里用return输出返回值。

【函数带参数的说明】

1:函数体中位置参数($0\$1、$2、$#、$*、$?、$$以及$@)都可以是函数的参数
2:父脚本的参数则临时地被函数参数所掩盖或隐藏
3:$0比较特殊,它仍然是父脚本的名称
4:当函数完成时,原来的命令行参数会恢复
5:在shell函数里面,return命令的功能的工作方式与exit相同,用于跳出函数
6:在shell函数体里使用exit会终止整个shell脚本
7:return语句会返回一个退出值给调用的程序
--------------------------------------------------------------------------------------------------
附:1 shell的特殊位置变量解释:

$0 取脚本的文件名及路径
$1,$2 给脚本传参数
$* 把一堆参数集合成一个参数,传给脚本
$# 一共传了多少个参数
$$ 脚本的pid
$? 上一个脚本执行的返回值
$@ 与$*类似,区别是每个参数是分开的

测试:函数调用

 [root@bqh-117 scripts]# vim hsdy.sh
#!/bin/sh
bqh() {
echo "I am bqh linux."
} function jyw() {
echo "I am jyw linux."
}
bqh
jyw

解释:我们定义了两个函数,一个bqh,一个jyw,这两个函数里的命令分别为输入"I am bqh linux."和"I am jyw linux.",函数下面最终是调用他们,所有我们执行脚本结果如下:

测试:if传参数用法

 [root@bqh-117 scripts]# vim hscc.sh
#!/bin/sh
#no.1
[ "$#" -ne 1 ]&&{ #判断用户是否输入了一个网址
echo "$0 请输入一个网址!" #取脚本的文件名及路径及请输入一个网址!
exit 1
}
#no.2
wget --spider --timeout=8 --tries=2 $1 &>/dev/null #若用户输入传参数是正确的,就执行wget命令
if [ "$?" -eq 0 ];then #判断以上命令执行是否有误
echo "$1 Httpd is Running... " #若判断以上命令无误,输入用户传参数及检测结果
else
echo "$1 Httpd is Stoped..." #若判断以上命令有误,输出用户传参数及检测结果
exit 2
fi

运行脚本效果如下:

接下来我们使用shell函数来实现,如下:

 [root@bqh-117 scripts]# vim hscc.sh
#!/bin/sh
#no.1
[ "$#" -ne 1 ]&&{ #判断用户是否输入了一个网址
echo "$0 请输入一个网址!" #取脚本的文件名及路径及请输入一个网址!
exit 1
}
#no.2
wget --spider --timeout=8 --tries=2 $1 &>/dev/null #若用户输入传参数是正确的,就执行wget命令
if [ "$?" -eq 0 ];then #判断以上命令执行是否有误
echo "$1 Httpd is Running... " #若判断以上命令无误,输入用户传参数及检测结果
else
echo "$1 Httpd is Stoped..." #若判断以上命令有误,输出用户传参数及检测结果
exit 2
fi
#============================================================================================
function chuancan() { #定义一个chuancan函数提醒用户输入一个网址
echo "$0 请输入一个网址" #取脚本的文件名及路径及请输入一个网址!
exit 1
} function jc_url() { #定义一个jc_url的函数检测用户输入参数是否正确及检测结果
wget --spider --timeout=8 --tries=2 $1 &>/dev/null #若用户输入传参数是正确的,就执行wget命令
if [ "$?" -eq 0 ] #判断以上命令执行是否有误
then
echo "$1 Httpd is Running... " #若判断以上命令无误,输入用户传参数及检测结果
else
echo "$1 Httpd is Stoped..." #若判断以上命令有误,输出用户传参数及检测结果
exit 1
fi
} function panduan() { #定义最后结果的函数
if [ "$#" -ne 1 ] #如果用户输入的传参数不是1
then #那么
chuancan #调用chuancan函数
fi
jc_url $1 #如果用户输入的传参数是1,那么久调用jc_url 函数
} panduan $* #把命令行接收的所有参数传给函数内部

我们换一种效果加以对比if脚本和函数脚本:

运行脚本效果如下:

案例实战:利用菜单选项脚本,实现shell函数调用(以安装nginx服务为例)

 [root@bqh-117 scripts]# vim yjaz.sh
#!/bin/sh
function menu() { #定义一个菜单函数
cat << bqh
++++++++++++++++++++++++++++++++++++++++++++++++++
| |
| 一键安装服务指南: |
| ====================== |
| 1、 安装Nginx |
| _o0o_ 2、 安装Apache |
| 088"."880 3、 安装MySQL |
| (|-_-|) 4、 安装PHP |
| _.\=/._ 5、部署LNMP环境 |
| __/- -\__ 6、安装zabbix监控 |
| ‘\ * /‘ 7、退出此服务程序 |
| / * \ 8、关闭计算机 |
| || * || ====================== |
| \\ * // |
| ||| b q h ||| |
| ___ ___ name: aゞ锦衣卫 |
| ___‘. /--.--\ .‘___ date:2019-04-11 |
--------------------------------------------------
bqh
}
menu if [ ! -d /home/bqh/tools ] #判断是否有/home/bqh/tools目录,没有的话就创建一个
then
mkdir -p /home/bqh/tools
fi
azlj_dir=/home/bqh/tools read -p "请输入1-8任意数:" num #利用read读取外界传递的参数
if [ ${#num} -ne 1 ] #判断读取的参数是否是一个,如果不是给出提示并退出
then
echo "请输入1|2|3|4|5|6|7|8 任意数"
exit 1
fi expr $num + 1 &>/dev/null #利用expr 检查传递过来的参数是否为整数,并将结果定向空 if [ "$?" -ne 0 ] #判断上面检查结果是否为0,若不为0给出提示并退出。
then
echo "请输入数字"
exit 1
fi if [ "$num" -eq 0 ] #判断输入的值是否等于0,若等于给出提示并退出。
then
echo "请输入比0大的整数"
exit 1 elif [ "$num" -gt 8 ] #判断输入的值是否大于8,若大于给出提示并退出。
then
echo "请输入比9小的整数"
exit 1
fi
#=======================================
function nginx_az () { #定义nginx安装函数。
yum install -y zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel &>/dev/null
if [ $? -eq 0 ]
then
cd $azlj_dir && wget -q http://nginx.org/download/nginx-1.6.3.tar.gz &>/dev/null && \
groupadd -r nginx && \
useradd -s /sbin/nologin -g nginx -M nginx && \
tar zxf nginx-1.6.3.tar.gz && \
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module -
-with-http_stub_status_module &>/dev/null && \ make && make install &>/dev/null
fi
if [ -e /application/nginx/sbin/nginx ]
then
ln -s /application/nginx-1.6.3/ /application/nginx && /application/nginx/sbin/nginx && \
echo "nginx 安装成功并启动!"
fi
} if [ $num -eq 1 ] #如果输入1值时,给出相应提示并调用nginx_az函数。
then
echo "开始安装nginx请稍等..." && nginx_az
fi

执行脚本效果如下:

以上脚本首先是通过if判断用户输入的值是否符合条件,后面函数定义安装nginx,最后调用函数一键安装。

shell 函数用法的更多相关文章

  1. shell 函数的高级用法

    函数介绍 linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用 语法格式 如何调用函数 shell终端中定义函数 [root@master da ...

  2. Shell入门教程:Shell函数详解

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...

  3. (转)Shell函数

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.  函数 ...

  4. Linux Shell系列教程之(十五) Shell函数简介

    本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...

  5. shell函数与数组

    shell函数与数组 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么要使用shell函数 简单的说函数的作用就是把程序里多次调用的相同的代码部分定义成一份,然后起个名字, ...

  6. shell函数【参数传递及输入输出】&内置函数

    Linux——shell脚本基础3:shell函数[参数传递及输入输出]&内置函数 函数定义 1 退出状态 1 参数传递 2 标准IO 2 脚本调试 2 AND&OR 3 内置命令补充 ...

  7. Shell函数使用方法

    Shell函数是一组命令集或语句组成一个可用块.利用函数可以简化脚本编写.函数要求先定义再使用,调用函数时直接使用函数名即可.这里主要介绍shell编程中函数定义.调用.获取函数参数以及获取函数返回值 ...

  8. Shell基础(三):使用for循环结构、使用while循环结构、基于case分支编写脚本、使用Shell函数、中断及退出

    一.使用for循环结构 目标: 本案例要求编写一个Shell脚本chkhosts.sh,利用for循环来检测多个主机的存活状态,相关要求及说明如下: 1> 对192.168.4.0/24网段执行 ...

  9. system、 exec函数族、fork函数用法说明

    system(), exec函数族, fork函数用法说明 启动一个新线程的方式: system() 该函数经常用来在C程序中调用shell脚本或者命令行程序. 特点: 效率低下,首先需要创建一个sh ...

随机推荐

  1. 痞子衡嵌入式:备受开源社区推崇的分布式版本控制工具(Git)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是分布式版本控制工具Git. 1.为什么需要版本控制系统? 单人软件项目开发过程,往往很多功能都是逐步增加的,在代码开发过程中,有的时候功 ...

  2. 浅谈JavaScript之事件(上)

    一  简述JavaScript及其在浏览器中的地位 (一)  浏览器主要构成 虽然不同浏览器之间存在差异(如Google Chrome,Firefox,Safari和IE等),但单从浏览器构成来说,大 ...

  3. 【Jquery系列】之Jquery 选择器

    1   概述 本篇文章为穿插文章,ASP.NET MVC系列目前写了如下几篇: 详解google Chrome浏览器(理论篇) 详解Google Chrome浏览器(操作篇)(上) 详解Google ...

  4. RDD内存迭代原理(Resilient Distributed Datasets)---弹性分布式数据集

    Spark的核心RDD Resilient Distributed Datasets(弹性分布式数据集)   Spark运行原理与RDD理论 Spark与MapReduce对比,MapReduce的计 ...

  5. 第一册:lesson sixty five.

    原文: Not a baby. A:What are you going to do this evening Jill? B:I'm going to meet some friends, dad. ...

  6. glassfish SEC5054: Certificate has expired

    出现这个错误的原因是某一个证书过期了 解决方法 先备份 cp /root/glassfish3/glassfish/domains/domain1/config/cacerts.jks cacerts ...

  7. SSLTLS 服务器瞬时 Diffie-Hellman 公共密钥过弱【原理扫描】解决说明

    一.  修改SSL密码套件 1.1  加固方法: 1.1.1  操作步骤: 第一步:按下' Win + R',进入"运行",键入" gpedit.msc",打开 ...

  8. C#基础知识总结(七)

    摘要 C#最简单的两个算法:输入数字打印出菱形星星.冒泡排序1.输入数字打印出菱形星星 static void Main(string[] args) { //输入一个数,表示菱形星号,数字必须是一个 ...

  9. Centos7.6安装Oracle数据库

    一.安装Oracle前准备 1.创建运行oracle数据库的系统用户和用户组 [humf@localhost ~]$ su root #切换到root Password: [root@localhos ...

  10. Java高并发--缓存

    Java高并发--缓存 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在下图中每一个部分都可以使用缓存的技术. 缓存的特征 缓存命中:直接通过缓存获取到数据 命中率: ...