一、shell编程入门必备基础

1、vim编辑器的命令,vimrc设置

2、150个linux基础命令

3、linux中基础的系统服务crond,ssh网络服务,nfs,rsync,inotify,lnmp,sersync,nmap等

二、变量分类

1、全局变量

  1. [root@nfs-server ~]# env
  2. HOSTNAME=nfs-server
  3. TERM=linux
  4. SHELL=/bin/bash
  5. HISTSIZE=1000
  6. SSH_CLIENT=172.19.5.146 49184 22
  7. SSH_TTY=/dev/pts/1
  8. USER=root
  9. ……

2、局部变量 只对当前shell用户生效

定义环境变量:

①export OLDBOY=1——>定义环境变量,临时生效

②如果想要全局生效,需要加入到环境变量配置文件

  1. /etc/profile /etc/bashrc ~/.bashrc ~/.bash_profile
  2.  
  3. /etc/profile.d

③unset OLDBOY——>删除环境变量

④尽量用有意义的字符串定义变量,比如大写字母的方式

⑤驼峰语法定义:首个单词字母小写,其余单词首字母大写

  1. devPath=/server/scripts
  2. devFileList=`ls`

⑥注意单、双引号的问题,一般字符串用双引号定义

⑦引用变量时,注意金庸新著问题---将变量名用大括号包起来

  1. echo ${week}day

3、特殊位置变量

$0

获取当前执行的shell脚本的文件名,包括路径

$n

获取当前执行的shell脚本的第N个参数值,n=1..9,如果n大于9,就用${10}

$#

获取当前shell命令行中参数的总个数

$?

0表示成功***** 2权限拒绝, 126找到了命令,但无法执行

$$

获取当前shell的进程号(pid)

三、定义变量的三种方式

1、直接赋值

  1. x=10
  2. file=/etc/hosts
  3. 注:脚本中能用变量的地方尽量就用变量

2、传参

  1. $0 $1 ... $n $#
  2. 注:此方式脚本更加灵活

3、read交互式设置变量

1
2
3
-p 设置提示语句
-t 设置超时时间
-s 关闭回显,让输入不显示在屏幕上 

小题:写个atm程序,让你输入你的银行卡账号和密码,然后在屏幕上打印你的输入结果

  1. [root@zabbix scripts]# sh atm.sh
  2. 请输入你的银行卡:18774499487766
  3. 请输入你的密码:765689
  4. 你的银行卡 18774499487766
  5. “你的密码” 765689

四、变量的子串

1、获取变量值的长度

  1. OLDBOY="I am oldboy"
  2. echo ${#OLDBOY}

2、截取字符串

  1. [root@web01 ~]# OLDBOY="I am oldboy"
  2. [root@web01 ~]# echo ${OLDBOY:2}
  3. am oldboy
  4. [root@web01 ~]# echo ${OLDBOY:2:2}
  5. am
  6. [root@web01 ~]# echo ${OLDBOY:5}
  7. oldboy

3、字符串的删除

  1. #从前往后
  2. oldboy=abcABC123ABCabc
  3. [root@web01 scripts]# echo ${oldboy#abc}
  4. ABC123ABCabc
  5. [root@web01 scripts]# echo ${oldboy##a*c}
  6. #从后往前
  7. [root@web01 scripts]# echo ${oldboy%abc}
  8. abcABC123ABC
  9. [root@web01 scripts]# echo ${oldboy%%a*c}

4、字符串的替换

  1. [root@web01 ~]# OLDBOY=abcABC123ABCabc
  2. [root@web01 ~]# echo ${OLDBOY/123/456}
  3. abcABC456ABCabc
  4. [root@web01 ~]# echo ${OLDBOY/a/A}
  5. AbcABC123ABCabc
  6. [root@web01 ~]# echo ${OLDBOY//a/A}
  7. AbcABC123ABCAbc

5、变量的数值计算

①自增自减运算

  1. [root@web01 scripts]# i=0
  2. [root@web01 scripts]# echo $((i++))
  3. 0
  4. [root@web01 scripts]# echo $((i++))
  5. 1
  6. [root@web01 scripts]# echo $((i--))
  7. 4
  8. [root@web01 scripts]# echo $((i--))
  9. 3

②let

  1. [root@web01 ~]# i=1
  2. [root@web01 ~]# let i=i+8
  3. [root@web01 ~]# echo $i
  4. 9

③expr——可以判断是否为整数

  1. [root@web01 ~]# expr 3 - 2
  2. 1
  3. [root@web01 ~]# expr 1 + 2
  4. 3
  5. [root@web01 ~]# expr 2 - 1
  6. 1
  7. [root@web01 ~]# expr 1 + a
  8. expr: 非整数参数
    [ echo $? -eq 2 ]时,不是整数

④bc

  1. [root@web01 ~]# echo 1+1|bc
  2. 2
  3. [root@web01 ~]# echo 2*2|bc
  4. 4

⑤awk

  1. [root@web01 ~]# echo "5.4 4.3"|awk '{print ($1-$2)}'
  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、常用文件判断

①判断文件存在且为普通文件

  1. [root@zabbix scripts]# [ -f /etc/hosts ] && echo "表达式成立"||echo "表达式不成立"
  2. 表达式成立

②判断目录存在且为目录文件

  1. [root@zabbix scripts]# [ -d /etc ] && echo "表达式成立"||echo "表达式不成立"
  2. 表达式成立

③判断文件存在且为软链接文件

  1. [root@zabbix scripts]# [ -L /etc/rc.local ] && echo "表达式成立"||echo "表达式不成立"
  2. 表达式成立

④判断文件存在且可读

  1. [root@zabbix scripts]# [ -r /etc/hosts ] && echo "表达式成立"||echo "表达式不成立"
  2. 表达式成立

⑤判断文件存在且可执行

  1. [root@zabbix scripts]# [ -x /etc/init.d/sshd ] && echo "表达式成立"||echo "表达式不成立"
  2. 表达式成立

⑥判断文件存在且可写

  1. [root@zabbix scripts]# [ -w /etc/hosts ] && echo "表达式成立"||echo "表达式不成立"
  2. 表达式成立

2、常用字符串判断

①判断字符串长度是否为0

  1. [root@zabbix scripts]# [ -z "oldboy" ]&& echo "表达式成立"||echo "表达式不成立"
  2. 表达式不成立

②空则为0

  1. [root@zabbix scripts]# [ -z "" ]&& echo "表达式成立"||echo "表达式不成立"
  2. 表达式成立

③双引号里面有空格,空格不为0

  1. [root@zabbix scripts]# [ -z " " ]&& echo "表达式成立"||echo "表达式不成立"
  2. 表达式不成立

3、 整数比较

1
2
3
4
5
6
-eq  equal           等于
-ne  not equal       不等于
-gt  great than      大于
-ge  great equal     大于等于
-lt  less than  <   小于
-le  less equal ≤    小于等于
  1. [root@web01 scripts]# [ 3 -ne 1 ] && echo "表达式成立"||echo "表达式不成立"
  2. 表达式成立
  3. [root@web01 scripts]# [ 3 -eq 1 ] && echo "表达式成立"||echo "表达式不成立"
  4. 表达式不成立
  5. [root@web01 scripts]# [ 3 -ge 1 ] && echo "表达式成立"||echo "表达式不成立"
  6. 表达式成立
  7. [root@web01 scripts]# [ 3 -gt 1 ] && echo "表达式成立"||echo "表达式不成立"
  8. 表达式成立
  9. [root@web01 scripts]# [ 3 -le 1 ] && echo "表达式成立"||echo "表达式不成立"
  10. 表达式不成立
  11. [root@web01 scripts]# [ 3 -lt 1 ] && echo "表达式成立"||echo "表达式不成立"
  12. 表达式不成立

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,邮件报警,并且定时任务每三分钟执行一次检测

  1. cat check_mem.sh
    #!/bin/sh
  2. Mem=`free -m|awk 'NR==3{print $NF}'`
  3. if [ "$Mem" -lt "800" ]
  4. then
  5. echo $Mem|mail -s "系统内存低于800M" 774181401@qq.com
  6. fi
  1. [root@web01 scripts]# crontab -l|tail -2
  2. #check free Mem
  3. */3 * * * * /bin/sh /server/scripts/check_mem.sh &>/dev/null

 #企业面试题#002

②模拟启动nginx脚本,使用if语句判断输入的是否为start、stop、restart……

  1. #!/bin/sh
  2. . /etc/init.d/functions
  3. Nginx_Start="/application/nginx/sbin/nginx"
  4. Nginx_stop="${Nginx_Start} -s stop"
  5. if [ "$1" == "start" ]
  6. then
  7. ${Nginx_Start}
  8. action "starting Nginx" /bin/true
  9. elif [ "$1" == "stop" ]
  10. then
  11. ${Nginx_stop}
  12. pkill nginx
  13. action "Nginx is stopped" /bin/true
  14. elif [ "$1" == "restart" ]
  15. then
  16. ${Nginx_stop} && ${Nginx_Start}
  17. action "Nginx is restarting" /bin/true
  18. elif [ "$1" != "start" -a "$1" != "stop" -a "$1" != "restart" ]
  19. echo "USAGE: $0 {start|stop|restart}"
  20. fi

#企业面试题#003

③使用if语句实现对nginx以及MySQL服务进行检测,如果服务未启动,则启动服务

 1、通过端口

  1. #!/bin/sh
  2. . /etc/init.d/functions
  3. port=`lsof -i:80|grep nginx|wc -l`
  4. if [ $port -ge 2 ];then
  5. action "Nginx is running" /bin/true
  6. else
  7. action "Nginx is not running" /bin/false
  8. /application/nginx/sbin/nginx
  9. action "starting Nginx" /bin/true
  10. fi

#企业面试题004#

④批量创建用户user1,user2,user3……,并且设置随机密码,如果用户存在的时候提示用户已在并退出

  1. #!/bin/sh
  2. rm -f /tmp/user.log
  3. for n in `seq 3`
  4. do
  5. pass=`echo $RANDOM|md5sum|cut -c 1-8`
  6. #grep "user$n" /etc/passwd &>/dev/null
  7. id user$n &>/dev/null
  8. if [ $? -ne 0 ];then
  9. useradd user$n
  10. echo $pass|passwd --stdin user$n
  11. echo -e "user: user$n pass: $pass" >>/tmp/user.log
  12. else
  13. echo "user$n 已存在"
  14. exit
  15. fi
  16. done

2、通过进程的方式

  1. #!/bin/sh
  2. . /etc/init.d/functions
  3. port=`ps -ef|grep nginx|grep -v grep|wc -l`
  4. if [ $port -ge 2 ];then
  5. action "Nginx is running" /bin/true
  6. else
  7. action "Nginx is not running" /bin/false
  8. /application/nginx/sbin/nginx
  9. action "starting Nginx" /bin/true
  10. fi

3、wget返回内容的方式

  1. #!/bin/sh
  2. . /etc/init.d/functions
  3. port=`wget -T 5 --spider http://172.19.5.8 &>/dev/null`
  4. if [ $? -eq 0 ];then
  5. action "Nginx is running" /bin/true
  6. else
  7. /application/nginx/sbin/nginx
  8. action "starting Nginx" /bin/true
  9. fi

4、curl返回值200的方式(header)

  1. #!/bin/sh
  2. . /etc/init.d/functions
  3. port=`curl -s -I -w "%{http_code}\n" 172.19.5.8 -o /dev/null`
  4. if [ "$port" == "200" ];then
  5. action "Nginx is running" /bin/true
  6. else
  7. /application/nginx/sbin/nginx
  8. action "starting Nginx" /bin/true
  9. fi

2、case语句

语法

case 值 in

模式1)

command

;;

模式2)

command

;;

*)

command

;;

esac

让用户通过输入水果的名字,输出到屏幕上并加颜色

给输出字体加颜色

  1. 字体颜色设置:
  2. echo -e "\033[30m 黑色字oldboy trainning \033[0m"
  3. echo -e "\033[31m 红色字oldboy trainning \033[0m"
  4. echo -e "\033[32m 绿色字oldboy trainning \033[0m"
  5. echo -e "\033[33m 黄色字oldboy trainning \033[0m"
  6. echo -e "\033[34m 蓝色字oldboy trainning \033[0m"
  7. echo -e "\033[35m 紫色字oldboy trainning \033[0m"
  8. echo -e "\033[36m 天蓝字oldboy trainning \033[0m"
  9. echo -e "\033[37m 白色字oldboy trainning \033[0m"
  10. 背景颜色:
  11. echo -e "\033[40;37m 黑底白字 welcome to old1boy\033[0m"
  12. echo -e "\033[41;37m 红底白字 welcome to old2boy\033[0m"
  13. echo -e "\033[42;37m 绿底白字 welcome to old3boy\033[0m"
  14. echo -e "\033[43;37m 黄底白字 welcome to old4boy\033[0m"
  15. echo -e "\033[44;37m 蓝底白字 welcome to old5boy\033[0m"
  16. echo -e "\033[45;37m 紫底白字 welcome to old6boy\033[0m"
  17. echo -e "\033[46;37m 天蓝白字 welcome to old7boy\033[0m"
  18. echo -e "\033[47;30m 白底黑字 welcome to old8boy\033[0m"
  19. 关闭颜色\033[0m

3、for循环语句

语法:

#!/bin/bash

for i(变量) in {1..10}  in后面可以加命令`ls`  `seq 10`

do

echo $i

done

通过for循环写一个开机自启动优化脚本

  1. [root@zabbix scripts]# sh chkconfig.sh
  2. [root@zabbix scripts]# chkconfig|grep 3:on
  3. crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  4. network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  5. rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  6. sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  7. 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编程(一)的更多相关文章

  1. Linux运维人员如何学习python编程

    Linux运维人员如何学习python编程 从不会写代码,到自己独立能写代码解决问题 .这个问题很重要!盲目学习所谓的项目,最后 还是不会自己写代码解决问题.首先解决了独立能写代码解决问题,再通过项目 ...

  2. linux运维架构师职业规划

    1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...

  3. Linux运维必会的实战编程笔试题(19题)

    以下Linux运维笔试面试编程题,汇总整理自老男孩.马哥等培训机构,由运维派根据实战需求,略有调整: 企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理 ...

  4. linux运维、架构之路-shell编程(二)

    一.流程控制语句 1.if语句 ①if单分支:一个条件一个结果 1 2 3 4 if 条件   then      命令 fi ②if双分支:一个条件两个结果 1 2 3 4 5 6 if 条件    ...

  5. 马哥 Linux运维基础进阶和shell入门

    地址:http://edu.51cto.com/course/course_id-618.html 紧接马哥linux专题 第一讲 Bash变量: 1byte= -128,127 2bytes -32 ...

  6. Linux运维工程师成长必经之路

    本路线图是从0基础开始,全方位由浅入深,按照多年Linux培训经验和优秀教学方法制定的学习思路和学习方法,路线图包括初级入门.中级进阶.高级提升和资深冲刺四个阶段,每阶段对应着不同优秀的课程和学习方法 ...

  7. 合格linux运维人员必会的30道shell编程面试题及讲解

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1632876 超深度 ...

  8. (转)合格linux运维人员必会的30道shell编程面试题及讲解

    超深度讲解shell高级编程实战,截至目前shell编程课程国内培训机构最细的课程,不信请看学员表现的水平. 课程牛不牛,不是看老师.课表,而是看培养的的学生水平,目前全免费中伙伴们赶紧看啊. htt ...

  9. 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

    做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...

随机推荐

  1. C++基础--extern的用法

    extern作为外部变量扩展的用法: 1. 主要作用是扩展变量或者函数的应用范围: 2. extern的用法是相对于全局变量而言: 3. 在看到extern这个关键字的时候说明这个变量已经在别的源文件 ...

  2. 由AlphaGO引发的思考

    这几天AlphaGO的人机大战炒得热火朝天,给谷歌的AI做了一次大大的广告,可谓风头出尽,大有AI战胜一切的“趋势”.而且,像阿法狗.阿法猫之类的新词不断,成了饭前茶后人们议论的热点.作为一个留学过日 ...

  3. Fidder详解之get和post请求

    前言 本文会对Fidder这款工具的一些重要功能,进行详细讲解,带大家进入Fidder的世界,本文会让你明白,Fidder不仅是一个抓包分析工具,也是一个请求发送工具,更加可以当作为Mock Serv ...

  4. JavaScript性能优化小知识总结(转)

    JavaScript的性能问题不容小觑,这就需要我们开发人员在编写JavaScript程序时多注意一些细节,本文非常详细的介绍了一下JavaScript性能优化方面的知识点,绝对是干货. 前言 一直在 ...

  5. Scope_Pre_Post

    @Scope , 设置bean的生命周期,示例:   @Scope(value="prototype")//设置生存范围,一般用 singleton或prototype 14.@P ...

  6. 团队合作之Scrum

    CCSU小助手 一:开发团队简介 队名:瓜队 组员:钟文兴.周畅.吉刘磊.唐仲勋 宣言:We are a team at any time! 团队项目描述: 内容:“生活在长大”: 目标:为了方便对学 ...

  7. n对mod求模整除时转化成mod的数学式

    n对mod求模,它的值在0到mod-1之间,如果要求模整除的时候转化成mod可以用下面的式子: n = (n - 1 % mod + mod) % mod +1 这里先减一,模上mod再加一,这样如果 ...

  8. 模拟,找次品硬币,Counterfeit Dollar(POJ 1013)

    题目链接:http://poj.org/problem?id=1013 解题报告: 1.由于次品的重量不清楚,用time['L'+1]来记录各个字母被怀疑的次数.为负数则轻,为正数则重. 2.用zer ...

  9. Runloop理解

    看了一堂公开课,自己小结一下: Runloop: 内部有三个东东:(Source, Timer, Observer) 作用/本质:1.死循环 (为app 保活): 2.监听处理事件 Timer 理解: ...

  10. 并发队列 – 有界阻塞队列 ArrayBlockingQueue 原理探究

    一.ArrayBlockingQueue类图结构 如图ArrayBlockingQueue内部有个数组items用来存放队列元素,putindex下标标示入队元素下标,takeIndex是出队下标,c ...