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交互式设置变量
1
2
3
|
-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启动脚本应用
1
2
3
4
|
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、 整数比较
1
2
3
4
5
6
|
-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
2
3
|
与 条件表达式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}\n" 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 "\033[30m 黑色字oldboy trainning \033[0m"
echo -e "\033[31m 红色字oldboy trainning \033[0m"
echo -e "\033[32m 绿色字oldboy trainning \033[0m"
echo -e "\033[33m 黄色字oldboy trainning \033[0m"
echo -e "\033[34m 蓝色字oldboy trainning \033[0m"
echo -e "\033[35m 紫色字oldboy trainning \033[0m"
echo -e "\033[36m 天蓝字oldboy trainning \033[0m"
echo -e "\033[37m 白色字oldboy trainning \033[0m"
背景颜色:
echo -e "\033[40;37m 黑底白字 welcome to old1boy\033[0m"
echo -e "\033[41;37m 红底白字 welcome to old2boy\033[0m"
echo -e "\033[42;37m 绿底白字 welcome to old3boy\033[0m"
echo -e "\033[43;37m 黄底白字 welcome to old4boy\033[0m"
echo -e "\033[44;37m 蓝底白字 welcome to old5boy\033[0m"
echo -e "\033[45;37m 紫底白字 welcome to old6boy\033[0m"
echo -e "\033[46;37m 天蓝白字 welcome to old7boy\033[0m"
echo -e "\033[47;30m 白底黑字 welcome to old8boy\033[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 支持特殊字符 \b退一格
4、while循环语句
true 为真,条件永远成立
while true
do
echo "Hello world"
sleep 1
done
5、各个条件表达语句使用场景
if(取值判断)
for(正常循环处理)语句最常用,
while(守护进程无限循环,小于1分钟的任务都可以用while循环)
case(系统服务启动脚本)
linux运维、架构之路-shell编程(一)的更多相关文章
- Linux运维人员如何学习python编程
Linux运维人员如何学习python编程 从不会写代码,到自己独立能写代码解决问题 .这个问题很重要!盲目学习所谓的项目,最后 还是不会自己写代码解决问题.首先解决了独立能写代码解决问题,再通过项目 ...
- linux运维架构师职业规划
1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...
- Linux运维必会的实战编程笔试题(19题)
以下Linux运维笔试面试编程题,汇总整理自老男孩.马哥等培训机构,由运维派根据实战需求,略有调整: 企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理 ...
- linux运维、架构之路-shell编程(二)
一.流程控制语句 1.if语句 ①if单分支:一个条件一个结果 1 2 3 4 if 条件 then 命令 fi ②if双分支:一个条件两个结果 1 2 3 4 5 6 if 条件 ...
- 马哥 Linux运维基础进阶和shell入门
地址:http://edu.51cto.com/course/course_id-618.html 紧接马哥linux专题 第一讲 Bash变量: 1byte= -128,127 2bytes -32 ...
- Linux运维工程师成长必经之路
本路线图是从0基础开始,全方位由浅入深,按照多年Linux培训经验和优秀教学方法制定的学习思路和学习方法,路线图包括初级入门.中级进阶.高级提升和资深冲刺四个阶段,每阶段对应着不同优秀的课程和学习方法 ...
- 合格linux运维人员必会的30道shell编程面试题及讲解
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1632876 超深度 ...
- (转)合格linux运维人员必会的30道shell编程面试题及讲解
超深度讲解shell高级编程实战,截至目前shell编程课程国内培训机构最细的课程,不信请看学员表现的水平. 课程牛不牛,不是看老师.课表,而是看培养的的学生水平,目前全免费中伙伴们赶紧看啊. htt ...
- 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路
做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...
随机推荐
- jquery hover(overListener, outListener) || bind('mouseover',methodA).bind('mouseout',methodB)
1.区别: bind方式,进入外部区域和内部区域都会触发相关方法(methodA 或methodB): hover方式,进入内部区域不会再触发相关方法. 2.example: <body> ...
- css 简单梯形
通过css2D变形我们可以轻松得到平行四边形,那么通过此技巧可以得到梯形吗? no! 不过我们可以通过3D旋转得到类似这样的效果: transform:perspective(0.5em) rota ...
- chosen下拉框插件的使用
效果如下 第一步: 第二步: 根据HTML5规范, 通常在引入CSS和JS时不需要指明 type,因为 text/css 和 text/javascript 分别是他们的默认值. <link r ...
- 003Angular2中使用ng-bootstrap
1.检查@angular/cli版本 命令行ng -v ,版本号必须大于1.0.0-beta.24 2.新建工程 工程所在目录,命令行ng new my-app --style=scss 带style ...
- Java设计模式—责任链模式
责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...
- 21_AOP_Advice增强2(异常、引介)
[异常抛出增强] 异常抛出异常最适合的应用场景:事务管理. 当参与事务的某个Dao发生异常时,事务管理器就必须回滚事务. [异常抛出增强 例子] [操作数据库的Dao类:PersonDao.java] ...
- 解决Tensorflow源码安装的之后TensorBoard 无法使用的问题
作者 cnblog 修雨轩陈 我是按照 Tensorflow 下 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3 ...
- Android应用开发基础之八:广播与服务(二)
服务两种启动方式 startService:服务被启动之后,跟启动它的组件没有一毛钱关系 bindService:跟启动它的组件同生共死 绑定服务和解绑服务的生命周期方法:onCreate->o ...
- raw_input与input的区别
1. 版本差异 raw_input——>python2版本 input——>python3版本 2. 输入格式差异 就是raw_input()随便输都是字符串,而input()必须按照Py ...
- Oracle10g使用$ORACLE_HOME/rdbms/admin/awrrpt.sql报错
Enter value for report_name: Using the report name awrrpt_1_591_593.htmlselect output from table(dbm ...