linux运维、架构之路-shell编程(二)
一、流程控制语句
1、if语句
①if单分支:一个条件一个结果
1
2
3
4
|
if 条件 then 命令 fi |
②if双分支:一个条件两个结果
1
2
3
4
5
6
|
if 条件 then 命令 else 命令2 fi |
③if多分支:多个条件多个结果
1
2
3
4
5
6
7
8
9
10
11
12
13
|
if 条件 then 命令 elif 条件2 then 命令2 elif 条件3 then 命令3 …… else 命令4 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

#企业面试题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

2、case语句
①语法
1
2
3
4
5
6
7
8
9
10
11
12
13
|
case $x in 值1) 命令1 ;; 值2) 命令2 ;; 值3) 命令3 ;; *) 命令4 esac |
②case语句相当于多分支if语句,适合变量少,且为固定数字或者字符串集合,多用于系统启动脚本
#case实战菜单小题#

#!/bin/bash
cat<<EOF
1. install rsync
2. install nfs
3. install mysql
4. install all
5. exit
EOF
read -p '请输入你的选择:' num case $num in
1)
echo "install rsync suscess!"
;;
2)
echo "install nfs suscess!"
;;
3)
echo "install mysql suscess!"
;;
4)
echo "install all suscess!"
;;
5)
exit
;;
*)
echo "选择有误"
esac

#case结合while实战水果菜单选择#

#!/bin/sh
RED='\E[1;31m'
GREEN='\E[1;32m'
YELLOW='\E[1;33m'
RES='\E[0m' cat <<EOF
==================
1.apple
2.pear
3.banana
4.exit
==================
EOF
while true
do
read -p "请输入你喜欢吃的水果:" choice
case $choice in
1)
echo -e "你喜欢的水果是: $RED apple $RES"
;;
2)
echo -e "你喜欢的水果是: $GREEN pear $RES"
;;
3)
echo -e "你喜欢的水果是:$YELLOW banana $RES"
;;
4)
exit
;;
*)
echo "输入有误"
esac
done

#给输出字体加颜色#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
前景颜色:<br>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语句
①语法
1
2
3
4
5
6
7
|
for i(变量) in {1..10} in 后面可以加命令`ls` `seq 10` do echo $i done |
②通过for循环优化开机启动

#!/bin/sh
Close_Service=`chkconfig|grep 3:on|awk '{print $1}'|egrep -v "crond|network|sshd|rsyslog|sysstat"`
for name in $Close_Service
do
chkconfig $name off
done

4、while语句
①语法
1
2
3
4
5
6
7
8
9
|
while 条件 do 命令 done 条件永远成立--死循环 守护进程:不停止的进程 true |
②while按行读文件的方式

方式一、
exec <file
sum=0
while read line
do
cmd
done
方式二、
cat ${file_path}|while read line
do
cmd
done
方式三、
while read line
do
cmd
done<file

③防止脚本中断的方法
1
2
3
|
1、sh while .sh & 2、nohup /server/scripts/uptime.sh & 3、screen,保持会话 |
5、函数
①语法
1
2
3
4
|
#!/bin/bash oldboy(){ echo "Hello world" } |
注:oldboy为定义的函数,执行时不需要带小括号,函数定义及函数体必须在要执行的函数名的前面定义
②带参数的函数执行方法
1
2
3
4
|
在函数体中位置参数($1、$2、$3...$#、$*以及$@)都可以是函数的参数。 父脚本的参数临时被函数参数所掩盖或隐藏。 $0比较特殊,他仍然是父脚本的名称。 当函数完成时,原来的命令行参数会恢复 |

#!/bin/bash
function oldboyedu(){
echo "Hello world"
echo $0
echo $1
echo $2
exit
} etiantian(){
echo "good"
return 3
echo 'bad'
} #oldboyedu hanshu1 hanshu2
oldboyedu $1 $2
etiantian

③如何写好函数脚本
1
2
3
|
#分层 #每一个步骤可以写成一个函数 #每一个功能分拆为函数 |
④函数优势
把相同的程序段定义成函数,可以减少程序代码量。
增加程序的可读、易读性。
实现程序的功能模块化。
6、shell数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
x=(1 2 3) # 打印所有数组内容 [root@oldboyedu scripts]# echo ${x[*]} 1 2 3 #打印数组元素 [root@oldboyedu scripts]# echo ${x[0]} 1 [root@oldboyedu scripts]# echo ${x[1]} 2 [root@oldboyedu scripts]# echo ${x[2]} 3 #打印数组长度 [root@oldboyedu scripts]# echo ${#x[@]} 3 [root@oldboyedu scripts]# echo ${#x[*]} 3 |
二、各个语句应用场景
if(取值判断)
for(正常循环处理)语句最常用,
while(守护进程无限循环,小于1分钟的任务都可以用while循环)
case(系统服务启动脚本)
三、shell脚本调试
①要记得首先用dos2unix对脚本格式化。
②直接执行脚本根据报错来调试,有时报错不准确。
③sh -x调试整个脚本,显示执行过程。
④set -x和set +x调试部分脚本(在脚本中设置)
⑤echo输出变量及相关内容,然后紧跟着exit退出,不执行后面程序的方式,一步步跟踪脚本,对于逻辑错误比较好用。
写法:echo $var;exit
⑥最关键的是语法熟练、编码习惯、编程思想,将错误扼杀在萌芽之中,减轻调试负担,提高效率
四、控制循环结构中的走向
命令 |
说明 |
break n |
n表示跳出循环的层数,如果省略n表示跳出整个循环 |
continue n |
n表示退出到第n层继续循环,如果省略n表示跳过本次循环,忽略本次循环的代码,进入循环的下一次循环 |
exit n |
退出当前shell程序,n为返回值,n也可以省略,在下一个shell里通过$?接收这个n的值 |
return n |
用在函数里,作为函数的返回值,用于判断函数执行是否正确,和exit一样,如果函数里有循环,也会直接退出循环,退出函数 |
1、 break 跳出整个循环,继续循环后面的程序执行
2、 continue 结束本次循环,继续下一次循环
3、 exit 退出整个脚本
linux运维、架构之路-shell编程(二)的更多相关文章
- Linux运维人员如何学习python编程
Linux运维人员如何学习python编程 从不会写代码,到自己独立能写代码解决问题 .这个问题很重要!盲目学习所谓的项目,最后 还是不会自己写代码解决问题.首先解决了独立能写代码解决问题,再通过项目 ...
- linux运维架构师职业规划
1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...
- Linux运维必会的实战编程笔试题(19题)
以下Linux运维笔试面试编程题,汇总整理自老男孩.马哥等培训机构,由运维派根据实战需求,略有调整: 企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理 ...
- linux运维中的命令梳理(二)
回想起来,从事linux运维工作已近5年之久了,日常工作中会用到很多常规命令,之前简单罗列了一些命令:http://www.cnblogs.com/kevingrace/p/5985486.html今 ...
- linux运维、架构之路-shell编程(一)
一.shell编程入门必备基础 1.vim编辑器的命令,vimrc设置 2.150个linux基础命令 3.linux中基础的系统服务crond,ssh网络服务,nfs,rsync,inotify,l ...
- 马哥 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 ...
随机推荐
- IO流之递归
递归: 递归,指在当前方法内调用自己的这种现象 public void method(){ System.out.println(“递归的演示”); //在当前方法内调用自己 method(); } ...
- Number()转换规则
转换规则: Number(): 1)如果是Boolean值,true和false将分别转换为1和0. 2)如果是数字值,只是简单的传入和返回. 3)如果是null值,返回0. 4)如果是undefin ...
- java调用c#dll文件配置
1 在强大的c#语言和java语言之间,二者难免会因为某些特殊的要求会相互调用. 下面就以java调用c#的dll为例做详细介绍 1 在vs中的环境设置如下图,图片中程序仅作为讲解程序,在项目编译成 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(10)、ArcGIS Runtime SDK支持的空间数据类型
1.前言 移动端的数据来源非常重要,它决定了移动端功能的实现.早期的ArcGIS Android API中,主要以接入在线的数据源为主,因此主要实现在线的地图浏览.查询和路径分析.地理处理等从操作:在 ...
- JUnit_BeforeClass不报异常的 bug 处理
1.try{} cathce(Exception e){}将觉得会出问题的地方括起来测试. 2.main方法调用出问题的方法.
- SpringMvc-自定义视图
1.创建视图: 注意:创建视图的时候需要实现View接口的俩个方法 package com.atguigu.springmvc.views; import java.util.Date; import ...
- Machine Learing 入门 —— 开门第0篇
一.最近懒了 7月没怎么写博客,倒是一直在学Machine Learning的入门知识,在这里给大家推荐一个不错的自学网站:https://www.coursera.org/ ,Andrew Ng是联 ...
- hdu1215 七夕节---因子和
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1215 题目大意: 求N的因子和(不包括N本身) 解题思路: 模板传送门 #include<io ...
- hdu-2136 Largest prime factor---巧用素数筛法
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2136 题目大意: 每个素数在素数表中都有一个序号,设1的序号为0,则2的序号为1,3的序号为2,5的 ...
- Django:模板系统
一,常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二,常量 {{ 变量名 }} 变量名由字母数字和下划线组成. 点(.)在模板语言中有特殊 ...