[TOC]
第3课 if语句和case语句
第1章 if条件语句
1.1 单分支结构
第一种语法:
第二种语法:
嵌套语法:
1 2 3 4 5 6
| if <条件表达式> then if <条件表达式> then 指令 fi
|
1.2 双分支结构
如果…那么…,否则…
1 2 3 4 5 6
| if <条件表达式> then 指令1 else 指令2 fi
|
1 2 3 4 5 6
| if [ -f "$file"] then echo 1 else echo 2 fi
|
1.3 多分支结构
1 2 3 4 5 6 7 8 9
| if <条件表达式> then 指令1 elif <条件表达式> then 指令2 else 指令3 fi
|
注意:
1)多分支elif,每个elif后都有then
2)最后结尾的else后面不带then
第2章 if语句的多种条件表达式语法
2.1 test 条件表达式
1 2 3 4
| if test 表达式 then 指令 fi
|
2.2 [] 条件表达式
1 2 3 4
| if [ 字符串或算术表达式 ] then 指令 fi
|
2.3 [[]] 条件表达式
1 2 3 4
| if [ 字符串表达式 ] then 指令 fi
|
2.4 (()) 条件表达式
1 2 3 4
| if (( 算术表达式 )) then 指令 fi
|
2.5 命令表达式
2.6 案例
案例1 使用if分支 来比较两个数字的大小
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [root@backup /server/scripts] #!/bin/sh read -p "please input two number: " num1 num2 if [[ ! "$num1" =~ ^[0-9]+$ || ! "$num2" =~ ^[0-9]+$ ]] then echo "请输入正确的整数" exit fi if [ $num1 -gt $num2 ];then echo "$num1>$num2" elif [ $num1 -lt $num2 ];then echo "$num1<$num2" else echo "$num1=$num2" fi [root@backup /server/scripts] please input two number: 10 20 10<20
|
案例2 随机生成一个随机数1-100 判断生成的随机数和输入的随机数是否相等,如果相等则退出,大了提示大了,小则提示小了,总共猜了多少次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| echo $(($RANDOM%100+1)) [root@backup /server/scripts] #!/bin/sh ran=`echo $((RANDOM%100+1))` i=0 while true do let i++ read -p "请输入你猜的数字[1-100]: " num if [ $num -gt $ran ];then echo "你猜的数字大了" elif [ $num -lt $ran ];then echo "你猜的数字小了" else echo "恭喜你猜对了" echo "总共猜了${i}次" exit fi done
|
案例3: 按照系统版本号的不同 更改默认YUM源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| [root@backup /server/scripts] #!/bin/sh . /etc/init.d/functions os=`cat /etc/redhat-release |awk '{print $4}'` if [ "$os" = "(Final)" ] then os=`cat /etc/redhat-release|awk '{print $3}'` fi ping -c 1 -W1 www.baidu.com &>/dev/null if [ $? -ne 0 ];then systemctl restart network action "请检查网络" /bin/false else if [ ${os%%.*} -eq 7 ];then mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null if [ $? -eq 0 ];then action "yum源已更新完成......." /bin/true else action "yum源更新失败,请检查.." /bin/false exit fi elif [ ${os%%.*} -eq 6 ];then mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo &>/dev/null if [ $? -eq 0 ];then action "yum源已更新完成......." /bin/true else action "yum源更新失败,请检查.." /bin/false exit fi else echo "请检查你的版本号" fi fi [root@backup /server/scripts] yum源已更新完成....... [ OK ]
|
第3章 比较大小案例
1 2 3 4 5 6 7 8 9 10 11 12 13
| if [ $# -ne 2 ];then echo "USAGE:$0 arg1 arg2" exit 2 fi
expr $a + 1 &>/dev/null RETVAL1=$? expr $b + 1 &>/dev/null RETVAL2=$? if [ RETVAL1 -ne 0 -a RETVAL2 -ne 0 ];then echo "please input two int again" exit 3 fi
|
第4章 菜单的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #!/bin/sh echo -e "\t\t\t1 PHP5.5" echo -e "\t\t\t2 PHP5.7" echo -e "\t\t\t3 PHP7.1" echo -e "\t\t\t4 PHP7.2" cat<<EOF * * * * * * * * * * * * * * 1. MySQL * * 2. redis * * 3. PHP * * 4. iptables * * 5. zabbix * * * * * * * * * * * * * * EOF
|
第5章 Shell函数
5.1 函数介绍
使用shell函数的优势:
1.把相同的程序段定义为函数,可减少整个程序的代码量,提示开发效率
2.增加程序的可读性、易读性,提升管理效率
1 2 3 4
| function 函数名(){ 指令 return n }
|
shell函数的执行
1.执行shell函数时,函数名前的function 和函数后的小括号都不带
2.函数的定义必须要在执行的程序前加定义或加载
3.shell执行系统中各种程序的执行顺序,系统别名-函数-系统命令-可执行文件
4.函数执行时,会调用他的脚本公用变量,也可以为函数设置局部变量及特殊位置参数
5.在shell函数中,return 命令和exit相似,return的作用时退出函数,二exit时推出脚本
6.return语句会返回一个退出值给调用函数的房钱程序,而exit会返回一个退出值给当前shell
7.如果要将函数存放在独立的文件中,被脚本加载使用时,需要使用source 或 “.”
8.在函数中一般使用local定义局部变量 ,这些变量离开函数后会消失
5.2 函数实践
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash
oldboy(){ echo "I am oldboy" } function oldgirl(){ echo "I am oldgirl" } oldboy oldgirl
|
第6章 case条件语句
case语法
1 2 3 4 5 6 7 8 9 10 11 12 13
| case 变量 in 变量内容1) 命令组 ;; 变量内容2) 命令组 ;; 变量内容3) 命令组 ;; *) echo "请输入正确的变量" esac
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [root@backup /server/scripts] #!/bin/bash read -p "please input [shell|MySQL|kvm]: " name case $name in shell) echo "shell...." ;; MySQL) echo "mysql hehe ......" ;; kvm) echo "kvm hehe ......" ;; *) echo "请输入正确参数: " esac
|
case案例: 使用case开发一个启动脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| [root@backup /server/scripts] #!/bin/sh [ -f /etc/init.d/functions ] && . /etc/init.d/functions te=$1 test(){
if [ $? -eq 0 ];then action "Nginx $te is" /bin/true else action "Nginx $te is" /bin/false fi
} case $1 in start) /usr/sbin/nginx test ;; stop) /usr/sbin/nginx -s stop test ;; restart) /usr/sbin/nginx -s stop sleep 1 /usr/sbin/nginx test ;; reload) /usr/sbin/nginx -s reload test ;; status) echo "WEB端口号: `netstat -tnulp|grep master|grep '\<tcp\>'|awk '{print $4}'`" echo "WEB-PID: `ps axu|grep [n]ginx|grep master|awk '{print $2}'`" ;; *) echo "Usage: $0 {start|stop|status|restart|reload}" esac
|
生活案例: 吃饭
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| [root@backup /server/scripts] #!/bin/bash cat<<EOF 1.皇萌鸡 2.酸笋鱼 3.瓦香鸡 4.炒菜 5.酸辣粉 6.炒粉 7.面 8.饺子 9.不吃 EOF read -p "想吃什么,请按回车键 :" ran=`echo $((RANDOM%9+1))` case $ran in 1) echo "皇萌鸡" ;; 2) echo "酸笋鱼" ;; 3) echo "瓦香鸡" ;; 4) echo "炒菜" ;; 5) echo "酸辣粉" ;; 6) echo "炒粉" ;; 7) echo "面" ;; 8) echo "饺子" ;; 9) echo "不吃" ;; esac
|