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命令语句
循环,条件语句
查看脚本文件类型
[root@m01 ~]# file /server/scripts/fenfa.sh /server/scripts/fenfa.sh: Bourne-Again shell script text executable |
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' 对于包含sshd或rsyslog或crond或 network或sysstat的行 不处理 不进行替换 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