Bash   发布时间:2022-05-13  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了一步步理解Shell编程之函数用法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_618_1@大家好,今天给大家分享的是sHell编程中的函数用法,当然这个函数和数学的函数是不一样的,那么在sHell中的函数是什么样的,那么一起来看一下。@H_616_5@

@H_618_1@1、首先在linux中它有一个命令是:alias 也就是@H_616_5@别名@H_616_5@的意思,那么这时候我们需要实际操作看看这个alias@H_616_5@到底有什么用,如下:@H_616_5@
@H_616_5@

@H_618_1@
@H_616_5@@H_616_5@

@H_618_1@在以上图中我们使用了alias命令 后面跟着N=XXX 那么这个N呢就是一个别名,简单的说,当我们启动Nginx服务的时候我们会输入绝对路径,这时候我们可以设置一个别名,相当于N就等于xxx后面的那条路径,最后我们只输入N 那么就等于执行了启动命令。@H_616_5@

@H_618_1@函数也有类似于别名的作用,简单的说,函数的作用就是将程序里面多次被调用的代码组合起来,称为@H_616_5@函数体@H_616_5@,并取一个名字@H_616_5@称为(函数名)@H_616_5@,当我们需要用到这段代码的时候,我们就可以直接来调用函数名。@H_616_5@@H_616_5@

@H_618_1@
@H_616_5@@H_616_5@

@H_618_1@2、SHell函数的语法@H_616_5@@H_616_5@

@H_618_1@在sHell中 if语句有它的语法,for循环也有它的语法,那么sHell中的函数,那肯定也有它的语法有以下三种:@H_616_5@

@H_618_1@@H_616_5@

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

function 函数名 {
		指令...
		return -n
}

函数名 () {
	指令...
	return -n
}
提示:在以上的函数语法中,前面的funcation 表示声明一个函数!!! 可以不写 return -n 是指退出函数@H_616_5@ @H_618_1@
@H_616_5@

@H_618_1@例1:SHell函数实例如下@H_616_5@

@H_618_1@@H_616_5@

function fj () {
	echo "我是风姐!"
}

function zhangsan () {
	echo "我是张三!"
}

fj
zhangsan
@H_618_1@
@H_616_5@
@H_616_5@

@H_618_1@剖析:@H_616_5@@H_616_5@

@H_618_1@function fj () { @H_616_5@ # 前面的function是声明一个函数 名字叫 fj () {@H_616_5@
@H_616_5@echo "我是风姐!"@H_616_5@ #下面呢 我们执行操作.echo 我是风姐@H_616_5@
} @H_616_5@ #最后 我们以 } 为结束@H_616_5@
@H_616_5@

@H_618_1@function zhangsan () { @H_489_149@# 前面的function是声明一个函数 名字叫 zhangsan () {@H_616_5@@H_616_5@
@H_616_5@echo "我是张三!" #下面呢 我们执行操作.echo 我是张三@H_616_5@@H_616_5@
} #最后 我们以 } 为结束@H_616_5@@H_616_5@@H_616_5@
@H_616_5@@H_616_5@@H_616_5@

@H_618_1@fj @H_616_5@ #调用fj 函数@H_616_5@
zhangsan@H_616_5@
#调用zhangsan函数@H_616_5@
@H_616_5@@H_616_5@

@H_618_1@那么定义了两个函数,我们最终目的是要调用它所以 在函数的下面输入了fj 和 zhangsan 意思是说 我要调用这两个函数,那么这两个函数中有两个命令 输出一个张三和凤姐,所以在我们执行脚本的时候结果就会是如下:@H_616_5@

@H_618_1@
@H_616_5@

@H_618_1@
@H_616_5@

@H_618_1@例2:分离函数体执行函数的脚本文件@H_616_5@

@H_618_1@@H_616_5@

cat >>/etc/init.d/functions<< EOF
function zhangsan () {
	echo "我就是张三"
}
EOF
以上代码什么意思:我们可以看到第一行是cat >> /etc/....这个路径 我们完全可以理解为,把下面的内容 导入到/etc/init.d/functions这个文件中; 那么这个文件是Linux系统内置的脚本函数库@H_616_5@ @H_618_1@
我们可以清楚的看到我们写的函数已经导入到了/etc/init.d/functions 这个文件中,那么接下来进行操作了 如下:
@H_616_5@

@H_618_1@@H_616_5@

#!/bin/bash
if [ -f /etc/init.d/functions ]
  then
    . /etc/init.d/functions
fi
zhangsan
解释:if 如果@H_616_5@/etc/init.d/functions@H_616_5@是一个普通文件,那么我们执行@H_616_5@. /etc/init.d/functions@H_616_5@ 在这里这个@H_616_5@"."@H_616_5@是用来加载functions 中的命令或者变量参数等;最后因为我们在上面定义了@H_616_5@zhangsan@H_616_5@这个函数,那我们在最后一行可以调用这个zhangsan函数 输出如下:@H_616_5@@H_616_5@ @H_618_1@
@H_616_5@@H_616_5@

@H_618_1@那么在这里我们来一个总结:@H_616_5@

@H_618_1@我们定义函数过多的情况下,我们可以把函数写在某一个文件中,当我们写脚本的时候需要用到这个函数中的某一个指令,那么我们就可以直接来调用文件中的函数名!@H_616_5@

@H_618_1@
@H_616_5@

@H_618_1@例3:编写带参数的sHell函数实例@H_616_5@

@H_618_1@@H_616_5@

#!/bin/bash

function lisi () {
        echo 我的名字叫: $1
}
lisi $1
在这里我们定义了一个名字叫做lisi的函数,这里需要注意的是echo那行,正常的输出是没有问题的,但是在后面加了一个特殊的位置变量。$1 最后在我们调用函数的时候 后面也加了特殊位置变量 $1 执行效果如下:@H_616_5@ @H_618_1@
更多的位置参数变量大家可以参我这篇文章http://code.js-code.com/article/p-oxlodesv-brz.html
@H_616_5@

@H_618_1@
@H_616_5@

@H_618_1@3、利用SHell函数开发企业级URL检测脚本@H_616_5@

@H_618_1@这是书上的一部分案例,但是我还会在这里通过我的想法来解释整个脚本中的全部过程!@H_616_5@

@H_618_1@1)首先我们不用函数来写一个检测URL的脚本如下:@H_616_5@

@H_618_1@@H_616_5@

#!/bin/bash
#no.1
if [ "$#" -ne 1 ]
  then
      echo "/root/sh/ $0" 请您输入一个网址
      exit 1
fi
#no.2
wget --spider -q -o /dev/null --tries=1 -T 3 $1
if [ "$?" -eq 0 ]
  then
    echo "$1 检测是成功的!"
  else
    echo "$1 检测是失败的!"
    exit 1
fi
@H_618_1@
@H_616_5@

@H_618_1@剖析:@H_616_5@

@H_618_1@@H_616_5@

#!/bin/bash
#no.1
if [ "$#" -ne 1 ]              #如果用户输入的传参参数不是1
  then          # 那么  
      echo "/root/sh/ $0" 请您输入一个网址  #输出脚本路径和脚本名称 最后输出请您输入一个网址!
      exit 1            #退出脚本
fi              #结束
#no.2
wget --spider -q -o /dev/null --tries=1 -T 3 $1 #如果用户输入传参数是对的,那么执行wget命令最后$1是用户输入的内容
if [ "$?" -eq 0 ]    #如果以上wget测试成功了!
  then  #那么
    echo "$1 检测是成功的!"  #输出用户输入网址并输出是成功的
  else  #否则
    echo "$1 检测是失败的!"  #输出用户输入网址并输出是失败的
    exit 1      #退出脚本
fi    #fi结束
感觉不够养眼?没有关系,如下图@H_616_5@ @H_618_1@
@H_616_5@

@H_618_1@以上此脚本中包含了特殊位置变量$#等等这些参数,大家看不懂的可以参我之前的文章@H_616_5@

@H_618_1@最后运行的结果如下:@H_616_5@

@H_618_1@
@H_616_5@

@H_618_1@这不是重点,重点是我们使用sHell函数来写整个过程,如下:@H_616_5@

@H_618_1@@H_616_5@

function TS () {       
        echo "/root/sh/ $0" 请您输入一个网址
        exit 1
}

function check_url () {
        wget --spider -q -o /dev/null --tries=1 -T 3 $1
        if [ "$?" -eq 0 ] 
          then
            echo "$1 检测成功!"
          else
            echo "$1 检测失败"
            exit 1
        fi      
}

function JG () {
        if [ "$#" -ne 1 ]
          then
              TS
        fi
          check_url $1
}
JG $*
@H_618_1@剖析:@H_616_5@

@H_618_1@@H_616_5@

function TS () {       #定义一个名字为TS的函数 (提示的意思)
        echo "/root/sh/ $0" 请您输入一个网址 #执行的指令是 输出一个:请您输入一个网址
        exit 1    #退出
}

function check_url () {  #定义一个名字为check_url的函数 (检测的意思)
        wget --spider -q -o /dev/null --tries=1 -T 3 $1 #如果用户输入传参数是对的,那么执行wget命令最后$1是用户输
入的内容
        if [ "$?" -eq 0 ] #如果以上wget去测试成功了!
          then  #那么
            echo "$1 检测成功!"  #输出用户输入网址并输出是成功的
          else  #否则
            echo "$1 检测失败"    # 输出用户输入网址并输出是失败的
            exit 1  #退出
        fi      
}

function JG () {   #这是最后的函数JG(结果的意思) 
        if [ "$#" -ne 1 ]   ##如果用户输入的传参参数不是1
          then      #那么
              TS         #注意了!!! 调用TS 
        fi          
          check_url $1  #如果上面传参是1 那么就调用check_url函数
}
JG $*  #这里的$*就是把命令行接收的所有参数作为函数传给函数内部
最后我们再次执行脚本@H_616_5@@H_616_5@ @H_618_1@
@H_616_5@

@H_618_1@
@H_616_5@

@H_618_1@最后为了能够让大家清晰的看到if语句的脚本和函数脚本的对比,一张图解释:@H_616_5@

@H_618_1@
@H_616_5@

@H_618_1@
@H_616_5@
@H_616_5@

@H_618_1@4、案例二 @H_616_5@ 实现菜单脚本,使用函数编写如下@H_616_5@@H_616_5@:@H_616_5@@H_616_5@

@H_618_1@@H_616_5@

function CDAN(){
cat << yankerp  
+------------------------------------------------+
|                                                |
|        _o0o_          1. 安装Nginx             |
|        08880          2. 安装Apache            |
|       88"."88         3. 安装MysqL             |
|       (|-_-|)         4. 安装php               |
|        0\=/0          5. 部署LNMP环境          |
|      __/   \__        6. 安装zabbix监控        |
|     ‘\   ///‘       7. 退出此管理程序         |
|    / Linux一键 \      8. 关闭计算机            |
|  ||    Server   ||    ======================   |  
|  \        ////         一键安装服务           |
|   |||  i i i    |||               by Yankerp   |
|   ___        ___      ======================   |
|___‘.  /--.--\ .‘___                            |
+------------------------------------------------+
yankerp
}
CDAN

LOG_DIR=/usr/local/src
read -p "请您输入1-8任意数值:" NUM

if [ ${#NUM} -ne 1 ]
  then
        echo "请您输入1|2|3|4|5|6|7|8"
        exit 1
fi

expr $NUM + 1 &>/dev/null
if [ "$?" -ne 0 ]
   then
        echo "请您输入数值!"
        exit 1
fi

if [ "$NUM" -gt 8 ];then
        echo "请您输入比8小的数值"
        exit 1
elif [ "$NUM" -eq 0 ];then
        echo "请您输入比0大的数值"
        exit 1
fi
######################
function Nginx_DIR() {
        yum install -y gcc gcc-c++ pcre-devel zlib-devel openssl-devel &>/dev/null
        if [ $? -eq 0 ]
           then
                cd $LOG_DIR  && wget http://Nginx.org/download/Nginx-1.12.2.tar.gz &>/dev/null && useradd -M -s /sbin/nologin Nginx && \
        tar zxf Nginx-1.12.2.tar.gz && cd Nginx-1.12.2/ && \
                ./configure --prefix=/usr/local/Nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module  --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=Nginx &>/dev/null && make &>/dev/null && make install &>/dev/null 
        fi

        if [ -e /usr/local/Nginx/sbin/Nginx ];then
                ln -s /usr/local/Nginx/sbin/Nginx /usr/local/sbin/ && Nginx && echo "Nginx安装并启动成功!!!"
        fi
}

if [ $NUM -eq 1 ]
  then
     echo "开始安装Nginx请稍等..." && Nginx_DIR
fi
输出如下:@H_616_5@ @H_618_1@
@H_616_5@

@H_618_1@以上脚本首先通过了if语句进行各种判断, 判断用户输入的参数等等;在后面使用了函数 来定义了安装Nginx的操作,最后我们调用了函数使整个函数运行了起来!!!@H_616_5@@H_616_5@

@H_618_1@呃,大家可以参,若写的不好请谅解~ 我感觉对刚开始接触sHell的人还是蛮有帮助的,只不过使用了多分支的if语句,感觉有点繁琐,接下来就会更新case语句了这样就可以解决多分支if语句很繁琐的问题!!!@H_616_5@

@H_618_1@好了,本次就到这里,真心希望对您有帮助,再见!@H_616_5@

大佬总结

以上是大佬教程为你收集整理的一步步理解Shell编程之函数用法全部内容,希望文章能够帮你解决一步步理解Shell编程之函数用法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。