1.11-shell编程基础
1.11shell编程基础
内容:
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 "$a > $b "
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"$a > $b"
else
echo"$a no > $b"
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 "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 -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]