zoukankan      html  css  js  c++  java
  • shell 学习笔记7-shell-函数

    一、函数

      1、什么是shell函数

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

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

        可以失效程序功能模块化,使程序具备可移植性

        其实linux系统里面近2000个命令可以说都是shell的函数

      2、语法

        function 名称() 复合命令块[重定向]

    function 函数名 () {    #function可以忽略不写
        指令。。。
        return n         #和exit类似,return是退出函数
    }

      3、基础实践

        1)开发一个建立两个简单函数并调用执行

    [root@web1 scripts]# cat test21.sh 
    #!/bin/bash
    boy(){
            echo "i am boy"
    }
    function girl(){
            echo "i am girl"
    }
    boy
    girl
    [root@web1 scripts]# ./test21.sh 
    i am boy
    i am girl
    [root@web1 scripts]# cat test21-1.sh 
    #!/bin/bash
    boy(){
            echo "i am boy"
    }
    function girl(){
            echo "i am girl"
    }
    boy
    girl
    boy1
    [root@web1 scripts]# ./test21-1.sh 
    i am boy
    i am girl
    ./test21-1.sh: line 10: boy1: command not found
    [root@web1 scripts]# 

      2)分离函数体和执行行数的脚本文件

    [root@web1 scripts]# cat >>/etc/init.d/functions<<- EOF
    > boy(){
    > echo "i am boy"
    > }
    > EOF
    [root@web1 scripts]# !tail
    tail -3 /etc/init.d/functions
    boy(){
    echo "i am boy"
    }
    [root@web1 scripts]# 
    [root@web1 ~]# function boy1 {
    > echo "i am boy1"
    > }

     [root@web1 scripts]# boy1
     i am boy1

      4、实现企业级URL检查脚本

        经函数的传参换成脚本文件命令行传参,判断任意指定的url是否存在移除

        1)实践脚本传参,检查web URL是否正常

    [root@web1 scripts]# cat test23.sh 
    #判断传参格式是否为1
    #!/bin/bash
    
    if [ $# -en 1 ]    
    #“$#”获取当前执行的脚本后面接的参数总个数
            then
                    echo $"usage:$0 url"
                    exit 1
    fi
    
    wget --spider -q -o /dev/null --tries=1 -T 5 $1
    #T超时实践,这里的$1为脚本的参数
    if [ $? -eq 0 ]
    #“$?”获取上一个指令的执行状态返回值,0成功,非零失败
            then
                    echo "$1 is yes"
            else
                    echo "$1 is no"
    fi

        2)将上述检测的功能写成函数,并将函数传参转换成脚本命令行传参,判断任意指定的URL是否存在异常

    #!/bin/bash
    function usage(){
            echo $"usage:$0 url"
            exit 1
    }
    
    function check_url(){   #检测URL函数
            wget --spider -q -o /dev/full --tries=1 -T 5 $1
    #这里$1就是函数传参
            if [ $? -eq 0 ]
                    then
                            echo "$1 is yes"
            else            
                            echo "$1 is no"
            fi
    
    }
    
    function main(){    #主函数
            if [ $# -ne 1 ]
    #如果传入的是多个参数,则打印帮助函数,提示用户
                    then
                            usage
            fi
            check_url $1 
    } #接收函数的传参,即把下文main结尾的$*
    传到这里 main $* #这里的$*就是把命令行接收的所有参数作为函数参数传给函数内部,是一种常用收发

      运行结果

    [root@web1 scripts]# sh test24.sh  www.baidu.com
    www.baidu.com is yes
    [root@web1 scripts]# sh test24.sh  www.baidu1.com
    www.baidu1.com is no
    [root@web1 scripts]# 

       3)将函数的传参转换层脚本文件命令行传参,判断任意指定的url是否存在异常,并以更专业的显示

    #!/bin/sh
    . /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 $1
      if [ $? -eq 0 ]
       then
         action "$1 is yes." /bin/true      #action 就是调用函数库的函数
      else
         action "$1 is no." /bin/false
      fi
    }
    
    function main(){
      if [ $# -ne 1 ]
       then
         usage
      fi
      check_url $1
    }
    main $*

         效果

    [root@web1 scripts]# chmod +x test25.sh
    [root@web1 scripts]# ./test25.sh  www.baidu.com
    www.baidu.com is yes.                                      [  OK  ]
    [root@web1 scripts]# ./test25.sh  www.baidu1.com
    www.baidu1.com is no.                                      [FAILED]
    [root@web1 scripts]# 

      5、利用shell函数开发一键优化系统脚本

        centos6

    #!/bin/bash
    # author:oldboy
    # qq:31333741
    #set env
    export PATH=$PATH:/bin:/sbin:/usr/sbin
    # Require root to run this script.
    if [ "$UID" != "0" ]; then
        echo "Please run this script by root."
        exit 1
    fi
    
    #define cmd var
    SERVICE=`which service`
    CHKCONFIG=`which chkconfig`
    
    function mod_yum(){
        #modify yum path
        if [ -e /etc/yum.repos.d/CentOS-Base.repo ]
         then
           mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup&&
           wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 
        fi
    }
    
    function close_selinux(){
        #1.close selinux
        sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
        #grep SELINUX=disabled /etc/selinux/config 
        setenforce 0 &>/dev/null
        #getenforce
    }
    
    function close_iptables(){
        #2.close iptables 
        /etc/init.d/iptables stop
        /etc/init.d/iptables stop
        chkconfig iptables off
    }
    
    function least_service(){
        #3.least service startup
        chkconfig|awk '{print "chkconfig",$1,"off"}'|bash
        chkconfig|egrep "crond|sshd|network|rsyslog|sysstat"|awk '{print "chkconfig",$1,"on"}'|bash
        #export LANG=en
        #chkconfig --list|grep 3:on
    }
    
    function adduser(){
        #4.add oldboy and sudo
        if [ `grep -w oldboy /etc/passwd|wc -l` -lt 1 ]
          then
            useradd oldboy
            echo 123456|passwd --stdin oldboy
            cp /etc/sudoers /etc/sudoers.ori
            echo "oldboy  ALL=(ALL) NOPASSWD: ALL " >>/etc/sudoers
            tail -1 /etc/sudoers
            visudo -c &>/dev/null
        fi
    }
    
    function charset(){
        #5.charset config
        cp /etc/sysconfig/i18n /etc/sysconfig/i18n.ori
        echo 'LANG="zh_CN.UTF-8"'  >/etc/sysconfig/i18n 
        source /etc/sysconfig/i18n
        #echo $LANG
    }
    
    function time_sync(){
        #6.time sync.
        cron=/var/spool/cron/root
        if [ `grep -w "ntpdate" $cron|wc -l` -lt 1  ]
          then
            echo '#time sync by oldboy at 2010-2-1' >>$cron
            echo '*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' >>$cron
            crontab -l
        fi
    }
    
    function com_line_set(){
        #7.command set.
        if [ `egrep "TMOUT|HISTSIZE|HISTFILESIZE" /etc/profile|wc -l` -ge 3  ]
          then
            echo 'export TMOUT=300' >>/etc/profile
            echo 'export HISTSIZE=5' >>/etc/profile
            echo 'export HISTFILESIZE=5' >>/etc/profile
            . /etc/profile
        fi
    }
    
    function open_file_set(){
        #8.increase open file.
        if [ `grep 65535 /etc/security/limits.conf|wc -l` -lt 1 ]
          then  
            echo '*               -       nofile          65535 ' >>/etc/security/limits.conf 
            tail -1 /etc/security/limits.conf 
        fi
    }
    
    function set_kernel(){
        #9.kernel set.
        if [ `grep kernel_flag /etc/sysctl.conf|wc -l` -lt 1 ]
          then
            cat >>/etc/sysctl.conf<<EOF
            #kernel_flag
            net.ipv4.tcp_fin_timeout = 2
            net.ipv4.tcp_tw_reuse = 1
            net.ipv4.tcp_tw_recycle = 1
            net.ipv4.tcp_syncookies = 1
            net.ipv4.tcp_keepalive_time = 600
            net.ipv4.ip_local_port_range = 4000    65000
            net.ipv4.tcp_max_syn_backlog = 16384
            net.ipv4.tcp_max_tw_buckets = 36000
            net.ipv4.route.gc_timeout = 100
            net.ipv4.tcp_syn_retries = 1
            net.ipv4.tcp_synack_retries = 1
            net.core.somaxconn = 16384
            net.core.netdev_max_backlog = 16384
            net.ipv4.tcp_max_orphans = 16384
            net.nf_conntrack_max = 25000000
            net.netfilter.nf_conntrack_max = 25000000
            net.netfilter.nf_conntrack_tcp_timeout_established = 180
            net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
            net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
            net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
    EOF
            sysctl -p
        fi
    }
    function init_ssh(){
        cp /etc/ssh/sshd_config /etc/ssh/sshd_config.`date +"%Y-%m-%d_%H-%M-%S"`
        #sed -i 's%#Port 22%Port 52113%' /etc/ssh/sshd_config
        sed -i 's%#PermitRootLogin yes%PermitRootLogin no%' /etc/ssh/sshd_config
        sed -i 's%#PermitEmptyPasswords no%PermitEmptyPasswords no%' /etc/ssh/sshd_config
        sed -i 's%#UseDNS yes%UseDNS no%' /etc/ssh/sshd_config
        /etc/init.d/sshd reload &>/dev/null
    }
    
    function update_linux(){
        #10.upgrade linux.
        if [ `rpm -qa lrzsz nmap tree dos2unix nc|wc -l` -le 3 ]
          then
            yum install lrzsz nmap tree dos2unix nc -y
            #yum update -y
        fi
    }
    main(){
        mod_yum
        close_selinux
        close_iptables
        least_service
        adduser
        charset
        time_sync
        com_line_set
        open_file_set
        set_kernel
        init_ssh
        update_linux
    }
    main

        centos7

        未更新

      6、利用shell函数开发rsync服务启动脚本

    #!/bin/sh
    if [ $# -ne 1 ]
      then
        echo $"usage:$0{start|stop|restart}"
        exit 1
    fi
    if [ "$1" = "start" ]
      then
         rsync --daemon
         if [ `netstat -lntup|grep rsync|wc -l` -ge 1 ]
           then
             echo "rsyncd is started."
             exit 0
         fi
    elif [ "$1" = "stop" ]
      then
         pkill rsync
         if [ `netstat -lntup|grep rsync|wc -l` -eq 0 ]
           then
             echo "rsyncd is stopped."
             exit 0
         fi
    elif [ "$1" = "restart" ]
      then
        pkill rsync
        sleep 2
        rsync --daemon
    else
        echo $"usage:$0{start|stop|restart}"
        exit 1
    fi

    参考学习:https://blog.51cto.com/oldboy/1855639

  • 相关阅读:
    Linux基础---开关机与帮助
    Linux磁盘管理命令
    批处理之命令补充II
    LeetCode 328. 奇偶链表(Odd Even Linked List)
    LeetCode 岛屿的最大面积(探索字节跳动)
    LeetCode 复原IP地址(探索字节跳动)
    LeetCode 简化路径(探索字节跳动)
    LeetCode 最长公共前缀(探索字节跳动)
    LeetCode 无重复字符的最长子串(探索字节跳动)
    自动机器学习超参数调整(贝叶斯优化)
  • 原文地址:https://www.cnblogs.com/zhangxingeng/p/11158126.html
Copyright © 2011-2022 走看看