• linux运维、架构之路-shell编程(一)


    一、shell编程入门必备基础

    1、vim编辑器的命令,vimrc设置

    2、150个linux基础命令

    3、linux中基础的系统服务crond,ssh网络服务,nfs,rsync,inotify,lnmp,sersync,nmap等

    二、变量分类

    1、全局变量

    [root@nfs-server ~]# env
    HOSTNAME=nfs-server
    TERM=linux
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=172.19.5.146 49184 22
    SSH_TTY=/dev/pts/1
    USER=root
    ……

    2、局部变量 只对当前shell用户生效

    定义环境变量:

    ①export OLDBOY=1——>定义环境变量,临时生效

    ②如果想要全局生效,需要加入到环境变量配置文件

     /etc/profile  /etc/bashrc  ~/.bashrc ~/.bash_profile
    
     /etc/profile.d

    ③unset OLDBOY——>删除环境变量

    ④尽量用有意义的字符串定义变量,比如大写字母的方式

    ⑤驼峰语法定义:首个单词字母小写,其余单词首字母大写

    devPath=/server/scripts
    devFileList=`ls`

    ⑥注意单、双引号的问题,一般字符串用双引号定义

    ⑦引用变量时,注意金庸新著问题---将变量名用大括号包起来

    echo ${week}day

    3、特殊位置变量

    $0

    获取当前执行的shell脚本的文件名,包括路径

    $n

    获取当前执行的shell脚本的第N个参数值,n=1..9,如果n大于9,就用${10}

    $#

    获取当前shell命令行中参数的总个数

    $?

    0表示成功***** 2权限拒绝, 126找到了命令,但无法执行

    $$

    获取当前shell的进程号(pid)

    三、定义变量的三种方式

    1、直接赋值

    x=10
    file=/etc/hosts
    注:脚本中能用变量的地方尽量就用变量

    2、传参

    $0 $1 ... $n $#
    注:此方式脚本更加灵活

    3、read交互式设置变量

    -p 设置提示语句
    -t 设置超时时间
    -s 关闭回显,让输入不显示在屏幕上 

    小题:写个atm程序,让你输入你的银行卡账号和密码,然后在屏幕上打印你的输入结果

    [root@zabbix scripts]# sh atm.sh 
    请输入你的银行卡:18774499487766
    请输入你的密码:765689
    你的银行卡 18774499487766
    “你的密码” 765689

    四、变量的子串

    1、获取变量值的长度

    OLDBOY="I am oldboy"
    echo ${#OLDBOY}

    2、截取字符串

    [root@web01 ~]# OLDBOY="I am oldboy"
    [root@web01 ~]# echo ${OLDBOY:2}
    am oldboy
    [root@web01 ~]# echo ${OLDBOY:2:2}
    am
    [root@web01 ~]# echo ${OLDBOY:5}
    oldboy

    3、字符串的删除

    #从前往后
    oldboy=abcABC123ABCabc
    [root@web01 scripts]# echo ${oldboy#abc}
    ABC123ABCabc
    [root@web01 scripts]# echo ${oldboy##a*c}
    #从后往前
    [root@web01 scripts]# echo ${oldboy%abc}
    abcABC123ABC
    [root@web01 scripts]# echo ${oldboy%%a*c}

    4、字符串的替换

    [root@web01 ~]# OLDBOY=abcABC123ABCabc
    [root@web01 ~]# echo ${OLDBOY/123/456}
    abcABC456ABCabc
    [root@web01 ~]# echo ${OLDBOY/a/A}
    AbcABC123ABCabc
    [root@web01 ~]# echo ${OLDBOY//a/A}
    AbcABC123ABCAbc

    5、变量的数值计算

    ①自增自减运算

    [root@web01 scripts]# i=0
    [root@web01 scripts]# echo $((i++))
    0
    [root@web01 scripts]# echo $((i++))
    1
    [root@web01 scripts]# echo $((i--))
    4
    [root@web01 scripts]# echo $((i--))
    3

    ②let

    [root@web01 ~]# i=1
    [root@web01 ~]# let i=i+8
    [root@web01 ~]# echo $i
    9

    ③expr——可以判断是否为整数

    [root@web01 ~]# expr 3 - 2
    1
    [root@web01 ~]# expr 1 + 2
    3
    [root@web01 ~]# expr 2 - 1
    1
    [root@web01 ~]# expr 1 + a
    expr: 非整数参数
    [ echo $? -eq 2 ]时,不是整数

    ④bc

    [root@web01 ~]# echo 1+1|bc
    2
    [root@web01 ~]# echo 2*2|bc
    4

    ⑤awk

    [root@web01 ~]# echo "5.4 4.3"|awk '{print ($1-$2)}'
    1.1

    6、变量赋值

    apache启动脚本应用

    httpd=${HTTPD-/usr/sbin/httpd}
    prog=httpd
    pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
    lockfile=${LOCKFILE-/var/lock/subsys/httpd} 

    五、 条件表达式

    1、常用文件判断

    ①判断文件存在且为普通文件

    [root@zabbix scripts]# [ -f /etc/hosts ] && echo "表达式成立"||echo "表达式不成立"
    表达式成立

    ②判断目录存在且为目录文件

    [root@zabbix scripts]# [ -d /etc ] && echo "表达式成立"||echo "表达式不成立"
    表达式成立

    ③判断文件存在且为软链接文件

    [root@zabbix scripts]# [ -L /etc/rc.local ] && echo "表达式成立"||echo "表达式不成立"
    表达式成立

    ④判断文件存在且可读

    [root@zabbix scripts]# [ -r /etc/hosts ] && echo "表达式成立"||echo "表达式不成立"
    表达式成立

    ⑤判断文件存在且可执行

    [root@zabbix scripts]# [ -x /etc/init.d/sshd ] && echo "表达式成立"||echo "表达式不成立"
    表达式成立

    ⑥判断文件存在且可写

    [root@zabbix scripts]# [ -w /etc/hosts ] && echo "表达式成立"||echo "表达式不成立"
    表达式成立

    2、常用字符串判断

    ①判断字符串长度是否为0

    [root@zabbix scripts]# [ -z "oldboy" ]&& echo "表达式成立"||echo "表达式不成立"
    表达式不成立

    ②空则为0

    [root@zabbix scripts]# [ -z "" ]&& echo "表达式成立"||echo "表达式不成立"
    表达式成立

    ③双引号里面有空格,空格不为0

    [root@zabbix scripts]# [ -z " " ]&& echo "表达式成立"||echo "表达式不成立"
    表达式不成立

    3、 整数比较

    -eq  equal           等于
    -ne  not equal       不等于
    -gt  great than      大于
    -ge  great equal     大于等于
    -lt  less than  <   小于
    -le  less equal ≤    小于等于
    [root@web01 scripts]# [ 3 -ne 1 ] && echo "表达式成立"||echo "表达式不成立"
    表达式成立
    [root@web01 scripts]# [ 3 -eq 1 ] && echo "表达式成立"||echo "表达式不成立"
    表达式不成立
    [root@web01 scripts]# [ 3 -ge 1 ] && echo "表达式成立"||echo "表达式不成立"
    表达式成立
    [root@web01 scripts]# [ 3 -gt 1 ] && echo "表达式成立"||echo "表达式不成立"
    表达式成立
    [root@web01 scripts]# [ 3 -le 1 ] && echo "表达式成立"||echo "表达式不成立"
    表达式不成立
    [root@web01 scripts]# [ 3 -lt 1 ] && echo "表达式成立"||echo "表达式不成立"
    表达式不成立

    4、逻辑判断符

    与 条件表达式1 and 条件表达式2       -a
    或 条件表达式1 or 条件表达式2        -o
    非 !条件表达式1                     !
    

    5、练习题:开发脚本比较两个整数大小

    ①通过传参的方式

    ②read交互式

    五、流程控制语句

    1、if语句

    语法:

    一、if[判断条件];then

        执行的程序

    elif[判断条件];then

        执行的程序

    else

    fi

    单分支:一个条件一个结果

    双分支:一个条件两个结果

    多分支:多个条件多个结果

    #企业面试题#001

    ①开发检测系统内存监控脚本,如果低于800M,邮件报警,并且定时任务每三分钟执行一次检测

    cat check_mem.sh
    #!/bin/sh Mem=`free -m|awk 'NR==3{print $NF}'` if [ "$Mem" -lt "800" ] then echo $Mem|mail -s "系统内存低于800M" 774181401@qq.com fi
    [root@web01 scripts]# crontab -l|tail -2
    #check free Mem
    */3 * * * * /bin/sh /server/scripts/check_mem.sh &>/dev/null

     #企业面试题#002

    ②模拟启动nginx脚本,使用if语句判断输入的是否为start、stop、restart……

    #!/bin/sh
    . /etc/init.d/functions
    Nginx_Start="/application/nginx/sbin/nginx"
    Nginx_stop="${Nginx_Start} -s stop"
    if [ "$1" == "start" ]
      then
        ${Nginx_Start}
        action "starting Nginx" /bin/true
    elif [ "$1" == "stop" ]
      then
        ${Nginx_stop}
        pkill nginx
        action "Nginx is stopped" /bin/true
    elif [ "$1" == "restart" ]
      then
        ${Nginx_stop} && ${Nginx_Start}
       action "Nginx is restarting" /bin/true
    elif [ "$1" != "start" -a "$1" != "stop" -a "$1" != "restart" ]
      echo "USAGE: $0 {start|stop|restart}"
    fi

    #企业面试题#003

    ③使用if语句实现对nginx以及MySQL服务进行检测,如果服务未启动,则启动服务

     1、通过端口

    #!/bin/sh
    . /etc/init.d/functions
    port=`lsof -i:80|grep nginx|wc -l`
    if [ $port -ge 2 ];then
      action "Nginx is running" /bin/true
    else 
      action "Nginx is not running" /bin/false
      /application/nginx/sbin/nginx
      action "starting Nginx" /bin/true
    fi

    #企业面试题004#

    ④批量创建用户user1,user2,user3……,并且设置随机密码,如果用户存在的时候提示用户已在并退出

    #!/bin/sh
    rm -f /tmp/user.log
    for n in `seq 3`
    do
      pass=`echo $RANDOM|md5sum|cut -c 1-8`
      #grep "user$n" /etc/passwd &>/dev/null
      id user$n &>/dev/null
      if [ $? -ne 0 ];then
        useradd user$n
        echo $pass|passwd --stdin user$n
        echo -e "user: user$n pass: $pass" >>/tmp/user.log
      else
            echo "user$n 已存在"
        exit
      fi
    done

    2、通过进程的方式

    #!/bin/sh
    . /etc/init.d/functions
    port=`ps -ef|grep nginx|grep -v grep|wc -l`
    if [ $port -ge 2 ];then
      action "Nginx is running" /bin/true
    else 
      action "Nginx is not running" /bin/false
      /application/nginx/sbin/nginx
      action "starting Nginx" /bin/true
    fi

    3、wget返回内容的方式

    #!/bin/sh
    . /etc/init.d/functions
    port=`wget -T 5 --spider http://172.19.5.8 &>/dev/null`
    if [ $? -eq 0 ];then
      action "Nginx is running" /bin/true
    else 
      /application/nginx/sbin/nginx
      action "starting Nginx" /bin/true
    fi

    4、curl返回值200的方式(header)

    #!/bin/sh
    . /etc/init.d/functions
    port=`curl -s -I -w "%{http_code}
    " 172.19.5.8 -o /dev/null`
    if [ "$port" == "200" ];then
      action "Nginx is running" /bin/true
    else 
      /application/nginx/sbin/nginx
      action "starting Nginx" /bin/true
    fi

    2、case语句

    语法

    case 值 in

    模式1)

        command

        ;;

    模式2)

        command

        ;;

    *)

        command

        ;;

    esac

    让用户通过输入水果的名字,输出到屏幕上并加颜色

    给输出字体加颜色

    字体颜色设置:
    echo -e "33[30m 黑色字oldboy trainning 33[0m"
    echo -e "33[31m 红色字oldboy trainning 33[0m"
    echo -e "33[32m 绿色字oldboy trainning 33[0m"
    echo -e "33[33m 黄色字oldboy trainning 33[0m"
    echo -e "33[34m 蓝色字oldboy trainning 33[0m"
    echo -e "33[35m 紫色字oldboy trainning 33[0m"
    echo -e "33[36m 天蓝字oldboy trainning 33[0m"
    echo -e "33[37m 白色字oldboy trainning 33[0m"
    背景颜色:
    echo -e "33[40;37m 黑底白字 welcome to old1boy33[0m"
    echo -e "33[41;37m 红底白字 welcome to old2boy33[0m"
    echo -e "33[42;37m 绿底白字 welcome to old3boy33[0m"
    echo -e "33[43;37m 黄底白字 welcome to old4boy33[0m"
    echo -e "33[44;37m 蓝底白字 welcome to old5boy33[0m"
    echo -e "33[45;37m 紫底白字 welcome to old6boy33[0m"
    echo -e "33[46;37m 天蓝白字 welcome to old7boy33[0m"
    echo -e "33[47;30m 白底黑字 welcome to old8boy33[0m"
    关闭颜色033[0m

    3、for循环语句

    语法:

    #!/bin/bash

    for i(变量) in {1..10}  in后面可以加命令`ls`  `seq 10`

    do

         echo $i

    done

    通过for循环写一个开机自启动优化脚本

    [root@zabbix scripts]# sh chkconfig.sh 
    [root@zabbix scripts]# chkconfig|grep 3:on
    crond              0:off    1:off    2:on    3:on    4:on    5:on    6:off
    network            0:off    1:off    2:on    3:on    4:on    5:on    6:off
    rsyslog            0:off    1:off    2:on    3:on    4:on    5:on    6:off
    sshd               0:off    1:off    2:on    3:on    4:on    5:on    6:off
    sysstat            0:off    1:on     2:on    3:on     4:on   5:on    6:off

    写一个好玩的倒计时脚本,在屏幕上输出10 09 08 07 06 05 ……

    echo命令知识点小结:

    echo  -n 不换行 -e 支持特殊字符 退一格

    4、while循环语句

    true  为真,条件永远成立

    while true

      do

       echo "Hello world"

       sleep 1

    done

    5、各个条件表达语句使用场景

    if(取值判断)

    for(正常循环处理)语句最常用,

    while(守护进程无限循环,小于1分钟的任务都可以用while循环)

    case(系统服务启动脚本)

    成功最有效的方法就是向有经验的人学习!
  • 相关阅读:
    Abstract与Virtual
    List 常用方法
    控制数据采样分布 计算概念
    中期答辩感想
    软件开发之团队理解
    详细设计理解
    竞赛系统需求分析
    软件代码规范之理解
    AngularJS 整理资料
    AngularJS合集
  • 原文地址:https://www.cnblogs.com/yanxinjiang/p/7568620.html
Copyright © 2020-2023  润新知