博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell脚本编程学习之路-函数
阅读量:5949 次
发布时间:2019-06-19

本文共 4274 字,大约阅读时间需要 14 分钟。

1.为什么要使用函数

先回顾一下别名的作用

[root@shellbiancheng ~]# alias httpd='/etc/init.d/httpd'[root@shellbiancheng ~]# httpd start正在启动 httpd:   [确定]

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

使用函数的优势:

(1)把相同的程序段定义成函数,可以减少整个程序的代码量。

(2)增加程序的可读性,易读性。

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

注意:linux系统的2000个命令都可以说是shell脚本的函数。

2.Shell函数的语法

简单语法格式(推荐使用):

函数名(){指令…return n}

规范语法格式:

function 函数名(){指令…return n}

提示:shell的返回值是exit输出返回值,函数里用return输出返回值

3.Shell函数的执行

调用函数:

(1)直接调用函数名即可不用带括号

注意:

a.调用函数时,函数后的小括号不需要带。

b.函数定义及函数体必须在要执行的函数名前面定义,shell的执行是从上到下按行执行的。

(2)函数的传参

函数的传参和脚本的传参类似,只是脚本名换成函数名即可。

函数名 参数1 参数2

函数后接的参数说明:

a.Shell的位置参数($1、$2、$3、$4、$5、$#、$*、$?、$@)都可以是函数的参数。

b.此时父脚本的参数临时地被函数参数所掩盖或隐藏。

c.$0比较特殊,它也代表父脚本的名称。

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

e.在shell函数里面,return命令功能与shell里exit类似,作用是跳出函数。

f.return语句会返回一个退出值(返回值)给调用函数的程序。

g.函数的参数变量是函数体里面定义的,如果是普通变量一般会使用local,比如说定义一个a就用local a 来定义。

4.Shell函数范例

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

[root@shellbiancheng jiaobenlianxi]# cat hanshu01.sh #/bin/bashnishishei(){    echo "who are you?"}function linzhongniao(){    echo "I am linzhongniao"}nishisheilinzhongniao

执行

[root@shellbiancheng jiaobenlianxi]# sh hanshu01.sh who are you?I am linzhongniao

如果我们调用的函数在开发的每一个脚本中都要调用可以将函数写到/etc/init.d/functions里面,这里为了方便看清用source执行脚本,也可以用点号“.”。

[root@shellbiancheng jiaobenlianxi]# tail -5 /etc/init.d/functions }linzhongniao(){    echo "I am linzhongniao"}[root@shellbiancheng jiaobenlianxi]# cat hanshu02.sh #/bin/bashsource /etc/init.d/functionsnishishei(){    echo "who are you?"}nishisheilinzhongniao[root@shellbiancheng jiaobenlianxi]# sh hanshu02.sh who are you?I am linzhongniao

范例2:函数传参转成脚本传参命令行参数,对任意指定URL判断是否正常。当然也可以判断服务,比如mysql 、httpd等方法类似这里就不说了,前面分支循环结构有判断服务的例子。

分步解答:

a.脚本传参检查web url是否正常。

b.检查的功能写成函数。

c.函数传参转换成脚本命令行传参,对任意指定URL判断是否异常。

[root@shellbiancheng jiaobenlianxi]# cat check_url.sh #!/bin/bash[ -f /etc/init.d/functions ]&& . /etc/init.d/functionsusage(){   #usage给用户一个提示    echo $"Usage: $0 url"     exit 1}RETVAL=0CheckUrl(){    wget -T 10 --spider -t 2 $1 &>/dev/null    jieguo=$?    if [ $jieguo -eq 0 ];then        action "$1 url" /bin/true    else        action "$1 url" /bin/false    fi      return $RETVAL}main(){    if [ $# -ne 1 ];then  判断参数输入参数的个数,如果不等于1执行usage函数    usage    fi    CheckUrl $1    jieguo=$?    Return $jieguo}main $*    $*这里的作用是不管敲多少个参数都当成一个,防止乱输入别的东西

执行结果:

[root@shellbiancheng jiaobenlianxi]# sh check_url.sh www.baidu.comwww.baidu.com url  [确定][root@shellbiancheng jiaobenlianxi]# sh check_url.sh www.sss.comwww.sss.com url[失败]

范例3:给字符串加颜色的传参例子

用if方式实现给字符串加颜色,输出颜色要用echo –e对反斜杠转义。SHAN='\E[31;5m'和RES='\E[0m'对内容高亮闪烁提示。

[root@shellbiancheng jiaobenlianxi]# cat color.sh #!/bin/bashRED_COLOR='\E[1;31m'GREEN_COLOR='\E[1;32m'YELLOW_COLOR='\E[1;33m'BLUE_COLOR='\E[1;34m'PINK='\E[1;35m'SHAN='\E[31;5m' #提示闪烁,配合echo –e 使用RES='\E[0m'usage(){    echo -e  ${SHAN} "Usage: $0{red|green|yellow|pink}" contents ${RES}    exit 1  }color(){if [ "$1" = "red" ];then    echo -e "${RED_COLOR} $2 $RES"elif [ "$1" = "green" ];then    echo -e "${GREEN_COLOR} $2 $RES"elif [ "$1" = "yellow" ];then    echo -e "${YELLOW_COLOR} $2 $RES"elif [ "$1" = "blue" ];then    echo -e "${BLUE_COLOR} $2 $RES"else    usagefi}main(){    if [ $# -ne 2 ];then    usage    fi    color $1 $2}main $*

拓展:

1.直接加颜色

[root@shellbiancheng jiaobenlianxi]# cat color1.sh #!/bin/bashecho -e "\033[30m 黑色字 I am linzhongniao \033[0m"echo -e "\033[31m 红色字 I am linzhongniao \033[0m"echo -e "\033[32m 绿色字 I am linzhongniao \033[0m"echo -e "\033[33m 黄颜色字 I am linzhongniao \033[0m"echo -e "\033[34m 蓝色字 I am linzhongniao \033[0m"echo -e "\033[35m 紫色字 I am linzhongniao \033[0m"echo -e "\033[36m 天蓝字 I am linzhongniao \033[0m"echo -e "\033[37m 白色字 I am linzhongniao \033[0m"

执行结果

shell脚本编程学习之路-函数

2.字背景颜色范围40---47

[root@shellbiancheng jiaobenlianxi]# cat beijingcolor.sh #!/bin/bashecho -e "\033[40;37m 黑底白字 I am linzhongniao \033[0m"echo -e "\033[41;37m 红底白字 I am linzhongniao \033[0m"echo -e "\033[42;37m 绿底白字 I am linzhongniao \033[0m"echo -e "\033[43;37m 黄底白字 I am linzhongniao \033[0m"echo -e "\033[44;37m 蓝底白字 I am linzhongniao \033[0m"echo -e "\033[45;37m 紫底白字 I am linzhongniao \033[0m"echo -e "\033[46;37m 天蓝白字 I am linzhongniao \033[0m"echo -e "\033[47;30m 白底黑字 I am linzhongniao \033[0m"

执行结果:

shell脚本编程学习之路-函数

转载于:https://blog.51cto.com/10642812/2093034

你可能感兴趣的文章
使用MVVM尝试开发Github客户端及对编程的一些思考
查看>>
算法-基础(一)数组基本操作 和 静态方法(后面编写算法的时候会用到)
查看>>
浏览器安全之同源策略
查看>>
把vue-cli build的结果放到服务器上
查看>>
JSON入门看这一篇就够了
查看>>
vue + vuex + koa2开发环境搭建及示例开发
查看>>
(二)神经网络入门之Logistic回归(分类问题)
查看>>
秒杀流量控制的执行方案
查看>>
[译][摘录]HEVC编码中的多视域和3D扩展,第四部分:3D-HEVC编码技术
查看>>
BEM命名 css模块化解决方案
查看>>
使用Tower克隆gitLab项目
查看>>
前端js压缩图片并上传
查看>>
我的Java设计模式-工厂方法模式
查看>>
线程存储简介
查看>>
WEEX系列 我的第一个WEEX DEMO
查看>>
Deploy NodeJS Docker to QiO Edge Cloud using Kubernetes
查看>>
【Hadoop学习】HDFS基本原理
查看>>
关于解决IE8以下版本获取DOM节点的方法
查看>>
vue学习笔记(二)
查看>>
Flask四之模板
查看>>