avatar

3.if语句和case语句

[TOC]

第3课 if语句和case语句

第1章 if条件语句

1.1 单分支结构

第一种语法:

1
2
3
4
if <条件表达式>
then
指令
fi

第二种语法:

1
2
3
if <条件表达式>; then
指令
fi

嵌套语法:

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 命令表达式

1
2
3
4
if 命令
then
指令
fi

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]# cat count.sh 
#!/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]# sh count.sh
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]# cat ran.sh
#!/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]# cat yum.sh 
#!/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]# sh yum.sh
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 #判断变量a是否为整数
RETVAL1=$? #获取expr命令返回值并赋值给RETVAL1
expr $b + 1 &>/dev/null #判断变量b是否为整数
RETVAL2=$? #获取expr命令返回值并赋值给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和oldgirl
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]# cat case.sh 
#!/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]# cat nginx_start.sh 
#!/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]# cat eat.sh 
#!/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
文章作者: Wu Fei
文章链接: http://linuxwf.com/2020/04/15/3-if%E8%AF%AD%E5%8F%A5%E5%92%8Ccase%E8%AF%AD%E5%8F%A5/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WF's Blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论