一、流程控制语句
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 退出整个脚本