jxdiscuz 发表于 2018-8-19 11:33:42

1.11-shell编程基础

  1.11
  shell编程基础
  内容:
  1. shell介绍
  2. 案例:系统开机启动优化
  3. shell脚本书写步骤
  4. if判断语句
  5. for循环语句
  前言:
  1. 如何学好shell编程:
  核心
  多练--多思考--再练--再思考,坚持循环
  大忌
  拿来主义(可以模仿 ,但要嚼烂了再下咽)
  方法
  阅读,模仿,思考    可以参考cat /etc/init.d/functions , /etc/rc.sysinit, etc/profile练习
第1章 基础知识
1.1 什么是shell
  命令解释器    cat/etc/shells
  CentOS默认的shell是bash
  查看linux中shell
  echo $SHELL
  cat /etc/passwd
1.2 什么是shell脚本
  命令大礼包,一个程序文件,包含若干行linux命令语句
  循环,条件语句
  查看脚本文件类型
  # file /server/scripts/fenfa.sh
  /server/scripts/fenfa.sh: Bourne-Again shell script text executable
第2章 为什么要学shell编程
  linux系统批量管理
  提升工作效率
  减少重复工作
第3章 学好shell编程所需的基础知识
  熟练使用vim编辑器
  熟悉ssh终端
  熟悉掌握linux常用命令
  熟练掌握linux正则表达式及三剑客命令
第4章 企业案例:系统开机启动项优化
  除了下面5个服务以外都关闭
  crond    sshd      network rsyslogsysstat
  定时任务远程连接网络系统日志系统工具
  方法一:
  第一个里程碑-分析想要的结果
  chkconfig 服务名字off
  这种形式
  chkconfig abrt-ccpp       off
  chkconfig abrtd         off
  chkconfig acpid         off
  
  第二个里程碑-先排除crond rsyslog network sshd sysstat
  # chkconfig |egrep "sshd|crond|rsyslog|network|sysstat"
  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
  .....
  
  第三个里程碑-取出服务名字
  # chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#\1#g'
  abrt-ccpp
  abrtd
  ....
  第四个里程碑-拼接出 chkconfig 服务名字 off 样子
  # chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#chkconfig \1 off#g'
  chkconfig abrt-ccpp      off
  chkconfig abrtd            off
  ...
  第五个里程碑-有了命令的形式样子,有人来运行 执行
  # echo pwd|bash
  /root
  最终命令
  # chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#chkconfig \1 off#g'|bash
  # 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
  
  排除的方法
  chkconfig |sed -r '/sshd|rsyslog|crond|network|sysstat/d'
  chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!p'
  拼接
  chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!p'|sed -r 's#(.*)0.*#\1#gp'
  chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!p'
  对于包含sshd或rsyslog或crond或 network或sysstat的行 不处理 不进行替换 sg
  //!      s###g
  方法2    :
  # chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!s#(.*)0.*#\1#gp'
  abrt-ccpp
  abrtd
  acpid
  atd
  auditd
  省略
  saslauthd
  smartd
  svnserve
  udev-post
  chkconfig|sed -r '/sshd|rsyslog|crond|network|sysstab/d;s#(.*)0.*#chkconfig \1 off#g'
第5章 书写一个脚本步骤
  统一脚本存放目录(自定义)   /server/scripts
  推荐使用vim编辑器编辑脚本(方便拍错)
  第一行支出由哪个命令解释器来执行脚本中的内容
  #!/bin/bash         命令解释器
  #author : 作者
  #date :   时间
  #ver : 版本
  #desc :描述
  例:编写一个脚本---显示日期和ip
  # vim /server/scripts/ip.sh
  #!/bin/bash                                           指定命令解释器执行脚本
  # author: gao
  # date: 180114
  # ver: 版本
  # desc:描述
  date +%F
  /sbin/ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'
  # file backup.sh             如果不知道 --文本文件
  backup.sh: ASCII text
  运行脚本
  1)/bin/bash
  # /bin/sh /server/scripts/ip.sh
  2018-01-13
  10.0.0.201
  2) 脚本的绝对路径--需要x权限
  # /server/scripts/ip.sh
  -bash: /server/scripts/ip.sh: Permission denied
  加上x权限
  # chmod +x /server/scripts/ip.sh
  # /server/scripts/ip.sh
  2018-01-13
  10.0.0.201
第2章 if判断
  如果你是男生&& 你喜欢女生
  如果 [ 你是男生 ];那么
  你喜欢女生
  果如
  if [ 你是男生 ];then
  你喜欢女生
  fi
  例:如果a等于10则显示恭喜你猜对了。
  a=1
  if [ $a == 10 ];then                              两个等号 中括号里面两边空格
  echo "gongxi "
  fi
  # cat pan.sh          把判断语句写进脚本
  #!/bin/bash
  a=$1
  if [ $a == 10 ];then                              shell遇到中括号,先敲俩空格
  echo "gongxi "
  fi
  # sh pan.sh 30         效果
  # sh pan.sh 10
  gongxi
  中括号里的东西都在哪里放着呢
  test测试
1.1 比大小
  equal   等于             ==-eq (test )
  #[ 2 -eq2 ]
  # echo $?
  0
  
  greater than       大于      >   -gt          [ 2 -gt 1 ]
  less   than      小于      <   -lt
  greater than 并且 equal 大于等于       >=-ge            [ 3 -ge 2 ]
  # [ 2 -ge 2 ]
  # echo $?
  0
  例:如果条件符合(成功)显示hahah
  # [ 0 -eq 0 ]&&echo hahah   [] 本身具有判断的功能
  hahah                                          &&命令执行成功,并且符合[]内的条件,执行后面命令
  # [ 1 -eq 0 ]&&echo hahah
  例:书写一个脚本:输入两个参数 如果第一个参数大于第二个参数则 显示 $1>$2。
  # cat pan.sh
  #!/bin/bash
  a=$1
  b=$2
  if [ $a -gt $b ];then
  echo &quot;$a > $b &quot;
  fi
  # shpan.sh 1 2
  # shpan.sh 10 2
  10 > 2
1.2 判断是否存在
  1. 判断文件是否存在
  2. 判断目录是否存在
1.2.1 判断/data/oldboy.txt 这个文件是否存在
  # [ -f/data/oldboy.txt ]
  # echo $?
  0                                                0表示存在
  # [ -f /data/oldboy.tx ]
  # echo $?
  1                                                非0则不存在
1.2.2 判断/data/         这个目录是否存在
  # [ -d /data/ ]
  # echo $?
  0
  # [ -d /dataa/ ]
  # echo $?
  1
  vim有个模板,比如,只要你创建.sh文件,就会显示格式(文件名,姓名之类),叫vimrc,不建议使用
  elif 另一个条件
  例:判断你输入的目录是否存在,如果不存在就创建他。
  # cat dir.sh
  #!/bin/bash
  #filename:dir.sh
  dir=$1
  if [ ! -d $dir ];then                !不   如果目录不存在那么
  mkdir -p $dir                           创建这个目录
  echo$dir create                     显示已经创建好了 目录 dir
  fi
  # sh dir.sh /oldboy
  # sh dir.sh /oldbaby
  /oldbaby create
  小结:
  1.判断 if
  if [ $a -eq $b ];then
  echo
  fi
  2.在if中可以使用的内容-eq-ge*** -gt    -f***   -d***
  了解:if的第三种用法   如果成功了--显示什么      如果不成功--显示什么
  if [ $a -gt $b ];then
  echo&quot;$a > $b&quot;
  else
  echo&quot;$a no > $b&quot;
  fi
  了解:if的第四种表达   如果成功了--下一个条件(成功)--下一个条件
  不断地判断
第3章 循环
  for循环语句
  语法: for 变量名 in 变量取值列表
  do.
  指令..
  done..
  例:显示1 2 3 4 5 .... 10
  fornumin 1 2 3 4 5 6 7 8 9 10         for循环执行过程
  do                                     第一次 num 1      第二次 num 2
  echo $num                         echo 1            echo2
  done
  for num in {1..10}
  do
  echo $num
  done
  实例:优化linux开机启动项目
  第一个里程碑:明确目标-关闭不必要的 除了network crond sshd rsyslog sysstat
  chkconfig 服务名字 off
  第二个里程碑:使用循环之后 我们要的样子
  for fu in 列表    ##列表是我们想要关闭的服务的名字
  do
  chkconfig $fu off
  done
  第三个里程碑:取出服务的名字
  # chkconfig |egrep -v &quot;sshd|crond|network|rsyslog|sysstat&quot;|awk '{print $1}'
  abrt-ccpp
  abrtd
  acpid
  atd
  此处省略 好多字
  第四个里程碑:得到结果
  for fu in$(chkconfig |egrep -v &quot;sshd|crond|network|rsyslog|sysstat&quot;|awk '{print $1}' )
  do
  #   chkconfig $fu off
  echo $fu
  done
  保险---确保万无一失
  排查脚本错误   调试脚本
  vim /opt.sh
  #!/bin/bash
  for fu in $(chkconfig|egrep -v &quot;sshd|crond|network|rsyslog|sysstat&quot;|awk '{prind $1}')
  do
  #chkcon $fu off
  echo $fu                先显示循环内容   检查是否正确
  done
  显示脚本的执行过程
  sh -xopt.sh          显示结果先执行的在下面
  如果感觉没问题把脚本里面内容一条一条,一个管道一个管道的排查
  2.判断   --if
  大于            [ 3 -gt 2 ]
  大于等于          [ 3 -ge 3 ]
  等于            [ 3== 3 ] 等于[ 3 -eq 3 ]
  判断文件是否存在[ -f /data/oldboy.txt ]
  判断目录是否存在[ -d /data ]
  if [ 条件 ];then
  做什么
  fi
  3.for循环
  for 变量in列表
  do
  命令
  done

页: [1]
查看完整版本: 1.11-shell编程基础