码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2017-12-11 18:54:02      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:一个   ack   使用   ssh   内存监控脚本   ret   判断   面试   opp   

一、流程控制语句

1、if语句

①if单分支:一个条件一个结果

if 条件
  then
     命令
fi

②if双分支:一个条件两个结果

if 条件
  then
    命令
else
   命令2
fi

③if多分支:多个条件多个结果

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语句

①语法

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

#给输出字体加颜色#

前景颜色:
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语句

①语法

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语句

①语法

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、sh while.sh &
2、nohup /server/scripts/uptime.sh &
3、screen,保持会话

5、函数

①语法

#!/bin/bash
oldboy(){
    echo "Hello world"
}  

注:oldboy为定义的函数,执行时不需要带小括号,函数定义及函数体必须在要执行的函数名的前面定义

②带参数的函数执行方法

在函数体中位置参数($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

③如何写好函数脚本

#分层
#每一个步骤可以写成一个函数
#每一个功能分拆为函数 

④函数优势

把相同的程序段定义成函数,可以减少程序代码量。
增加程序的可读、易读性。
实现程序的功能模块化。

6、shell数组

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
⑥最关键的是语法熟练、编码习惯、编程思想,将错误扼杀在萌芽之中,减轻调试负担,提高效率

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

标签:一个   ack   使用   ssh   内存监控脚本   ret   判断   面试   opp   

原文地址:http://www.cnblogs.com/yanxinjiang/p/8023803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!