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默认的shellbash

查看linuxshell

echo $SHELL

cat /etc/passwd

1.2 什么是shell脚本

命令大礼包,一个程序文件,包含若干行linux命令语句

循环,条件语句

查看脚本文件类型

[root@m01 ~]# 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 rsyslog  sysstat

定时任务 远程连接  网络    系统日志 系统工具 

方法一:

第一个里程碑-分析想要的结果

chkconfig 服务名字  off

这种形式

chkconfig abrt-ccpp       off

chkconfig abrtd           off

chkconfig acpid           off

 

第二个里程碑-先排除crond rsyslog network sshd sysstat

[root@oldboyedu-39-nb ~]# 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

.....

 

第三个里程碑-取出服务名字

[root@oldboyedu-39-nb ~]# chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#\1#g'

abrt-ccpp      

abrtd          

....

 

第四个里程碑-拼接出 chkconfig 服务名字 off 样子

[root@oldboyedu-39-nb ~]# chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#chkconfig \1 off#g'

chkconfig abrt-ccpp        off

chkconfig abrtd            off

...

 

第五个里程碑-有了命令的形式样子,有人来运行 执行

[root@oldboyedu-39-nb ~]# echo pwd|bash

/root

 

最终命令

[root@oldboyedu-39-nb ~]# chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#chkconfig \1 off#g'|bash

[root@oldboyedu-39-nb ~]# 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'

对于包含sshdrsyslogcrondnetworksysstat的行 不处理 不进行替换 sg

//!      s###g

 

 

方法2     :

[root@oldboyedu-39-nb ~]# 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

[root@oldboy-gao ~]# vim /server/scripts/ip.sh

#!/bin/bash                                           指定命令解释器执行脚本

# author: gao

# date: 180114

# ver: 版本

# desc:描述

 

date +%F

/sbin/ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'

 

[root@oldboy-gao scripts]# file backup.sh             如果不知道 --文本文件

backup.sh: ASCII text

 

运行脚本

1)/bin/bash

[root@oldboy-gao ~]# /bin/sh /server/scripts/ip.sh

2018-01-13

10.0.0.201

 

2) 脚本的绝对路径--需要x权限

[root@oldboy-gao ~]# /server/scripts/ip.sh

-bash: /server/scripts/ip.sh: Permission denied

 

加上x权限

[root@oldboy-gao ~]# chmod +x /server/scripts/ip.sh

[root@oldboy-gao ~]# /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

[root@oldboyedu-39-nb scripts]# cat pan.sh          把判断语句写进脚本            

#!/bin/bash

a=$1

if [ $a == 10 ];then                              shell  遇到中括号,先敲俩空格

   echo "gongxi "

fi

[root@oldboyedu-39-nb scripts]# sh pan.sh 30         效果

[root@oldboyedu-39-nb scripts]# sh pan.sh 10

gongxi

 

中括号里的东西都在哪里放着呢

test  测试

1.1 比大小 

equal     等于             ==  -eq (test )  

[root@oldboyedu-39-nb scripts]#  [ 2 -eq  2 ]

[root@oldboyedu-39-nb scripts]# echo $?

0

 

greater than       大于        >   -gt          [ 2 -gt 1 ]

less   than        小于        <   -lt

greater than 并且 equal 大于等于       >=  -ge            [ 3 -ge 2 ]

[root@oldboyedu-39-nb scripts]# [ 2 -ge 2 ]

[root@oldboyedu-39-nb scripts]# echo $?

0

 

:如果条件符合(成功)显示hahah

[root@oldboy-gao ~]# [ 0 -eq 0 ]&&echo hahah   [  ] 本身具有判断的功能

hahah                                          &&命令执行成功,并且符合[  ]内的条件,执行后面命令

[root@oldboy-gao ~]# [ 1 -eq 0 ]&&echo hahah

 

:书写一个脚本:输入两个参数 如果第一个参数大于第二个参数则 显示 $1>$2

[root@oldboyedu-39-nb scripts]# cat pan.sh

#!/bin/bash

a=$1

b=$2

if [ $a -gt $b ];then

   echo "$a > $b "

fi

 

[root@oldboyedu-39-nb scripts]# sh  pan.sh 1 2

[root@oldboyedu-39-nb scripts]# sh  pan.sh 10 2

10 > 2

 

1.2 判断是否存在

1. 判断文件是否存在

2. 判断目录是否存在

1.2.1 判断 /data/oldboy.txt 这个文件是否存在

[root@oldboyedu-39-nb scripts]# [ -f  /data/oldboy.txt ]

[root@oldboyedu-39-nb scripts]# echo $?

0                                                0表示存在

[root@oldboyedu-39-nb scripts]# [ -f /data/oldboy.tx ]

[root@oldboyedu-39-nb scripts]# echo $?

1                                                0则不存在

 

 

1.2.2 判断 /data/           这个目录是否存在

[root@oldboyedu-39-nb scripts]# [ -d /data/ ]

[root@oldboyedu-39-nb scripts]# echo $?

0

[root@oldboyedu-39-nb scripts]# [ -d /dataa/ ]

[root@oldboyedu-39-nb scripts]# echo $?

1

 

vim有个模板,比如,只要你创建.sh文件,就会显示格式(文件名,姓名之类),vimrc,不建议使用

elif 另一个条件

:判断你输入的目录是否存在,如果不存在就创建他。

[root@oldboyedu-39-nb scripts]# cat dir.sh

#!/bin/bash

#filename:dir.sh

dir=$1

if [ ! -d $dir ];then                !不   如果目录不存在  那么

   mkdir -p $dir                           创建这个目录

   echo  $dir create                     显示已经创建好了 目录 dir

fi

[root@oldboyedu-39-nb scripts]# sh dir.sh /oldboy

[root@oldboyedu-39-nb scripts]# 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  "$a > $b"

else

   echo  "$a no > $b"

fi

 

 

了解:if的第四种表达   如果成功了--下一个条件(成功)--下一个条件

          不断地判断

第3章 循环 

for循环语句

 语法: for 变量名 in 变量取值列表   

do.

  指令..

done..

 

:显示1 2 3 4 5 .... 10

for  num  in 1 2 3 4 5 6 7 8 9 10           for循环执行过程

do                                     第一次 num 1        第二次 num 2

     echo $num                         echo 1              echo  2

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

 

第三个里程碑:取出服务的名字

[root@oldboyedu-39-nb scripts]# chkconfig |egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}'

abrt-ccpp

abrtd

acpid

atd

此处省略 好多字

    

第四个里程碑:得到结果    

for fu in  $(chkconfig |egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}' )

do

#     chkconfig $fu off

      echo $fu

done

 

保险---确保万无一失

排查脚本错误   调试脚本

vim /opt.sh

#!/bin/bash

for fu in $(chkconfig|egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{prind $1}')

do

#chkcon $fu off

 echo $fu                先显示循环内容   检查是否正确

done   

显示脚本的执行过程

sh -x  opt.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