linux-centos-shell编程之条件语句(if ,case.)

前言

条件测试语句能够让Shell脚本根据实际工作灵活调整工作内容,例如判断系统的状态后执行指定的工作,或创建指定数量的用户,批量修改用户密码,这些都可以让Shell脚本通过条件测试语句完成。在简单的shell脚本程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程。
但是,单一的顺序结构使得脚本过于机械化,不够“智能”,难以处理更加灵活的系统任务。

一:条件测试

1.1:文件测试

1.1.1:test命令

test命令:测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值

命令基本格式
格式一:test 条件表达式
格式二:[ 条件表达式 ] ‘两端要有空格,此法更为常用’

1.1.2:文件测试
文件测试基本格式
[ 操作符 文件或目录 ] ‘注意两端空格’

&? 返回0表示条件成立,返回非零值表示条件不成立
&& 逻辑与,"而且"的意思
|| 逻辑或,"或者"的意思
在这里插入图片描述

[root@ shanan test]# ls
bbb.txt  ccc
[root@ shanan test]# test -d ccc
[root@ shanan test]# echo $?
0
[root@ shanan test]# test -f ccc
[root@ shanan test]# echo $?
1
[root@ shanan test]# [ -d ccc   ]  
[root@ shanan test]# echo $?
0
[root@ shanan test]# [ -x ccc   ]  
[root@ shanan test]# echo $?

[test1@ shanan test]$ ll
总用量 0
-rw-r--r--. 1 root root 0 717 11:52 bbb.txt
drwxr-xr-x. 2 root root 6 717 11:47 ccc
[test1@ shanan test]$ [ -w ccc  ]
[test1@ shanan test]$ echo $?
1
[test1@ shanan test]$ [ -r ccc  ]
[test1@ shanan test]$ echo $?
0
[test1@ shanan test]$ 

[test1@ shanan test]$ [ -r ccc ] && echo "yes"
yes
[test1@ shanan test]$ [ -w ccc ] && echo "yes"
[test1@ shanan test]$  [ -w ccc ] || echo "yes"
yes

1.2:整数测试

整数值比较

命令基本格式
[ 整数1 操作符 整数2 ]

常用的测试操作符

在这里插入图片描述

[root@ shanan ~]# [ 5 -gt 3 ]&&  echo "yes"
yes
[root@ shanan ~]# [ 5 -gt 3 ] &&  echo "yes"
yes
[root@ shanan ~]# [ 5 -gt 6 ] &&  echo "yes"
[root@ shanan ~]# [ 5 -le 3 ] &&  echo "yes"
[root@ shanan ~]# [ 5 -le 6 ] &&  echo "yes"
yes
[root@ shanan ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1819         146        1479           9         193        1481
Swap:          2047           0        2047

[root@ shanan ~]#  free -m  | grep "Mem" | awk '{print $4}'
1479

[root@ shanan ~]#  ddd=$(free -m | grep "Mem" | awk '{print $4}')
[root@ shanan ~]# echo $ddd
1479
[root@ shanan ~]#  [ $(free -m | grep "Mem" | awk '{print $4}') -gt 100 ] && echo "yes"
yes
[root@ shanan ~]# [ $(free -m | grep "Mem" | awk '{print $4}') -gt 80 ] && echo "yes"
yes
[root@ shanan ~]# 

1.3:字符串与逻辑测试

1.3.1:字符串比较
常用的格式
格式一:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式二:[ -z 字符串 ]

在这里插入图片描述

[root@ shanan ~]#  [ $LANG != "en_US" ] && echo "yes"
yes
[root@ shanan ~]# [ $LANG = "en_US" ] && echo "yes"
[root@ shanan ~]# [ "男" = "男" ] && echo "yes"
yes
[root@ shanan ~]# [ "男" != "男" ] && echo "yes"
[root@ shanan ~]#  [ "男" != "女" ] && echo "yes"
yes
[root@ shanan ~]#  [ "男" = "女" ] && echo "yes"
 

[root@ shanan ~]# vim 33.sh
#!/bin/bash
read -p "是否创建/opt/share目录:(yes/no)" ack
[ $ack = yes ] && mkdir /opt/share
echo "创建成功"
[root@ shanan ~]#  ./33.sh 
是否创建/opt/share目录:(yes/no)yes
创建成功
[root@ shanan ~]# ls
33.sh    rh  share  
[root@ shanan /]# vim 44.sh
[root@ shanan /]# sh 44.sh 
创建成功
[root@ shanan /]# cat 44.sh 
#!/bin/bash
[ -d /test/demo ]&& echo "已经存在" || mkdir /test/demo && echo "创建成功"
[root@ shanan /]# ls /test
bbb.txt  ccc  demo

1.3.2:逻辑测试
基本格式
格式一: [ 表达式1 ] 操作符 [ 表达式2 ] …
格式二: 命令1 操作符 命令2 …
1
2
3
在这里插入图片描述

[root@ shanan test]# [ -d /test/demo ] && echo "yes"
yes
[root@ shanan test]# [ ! -d /tes/demo ] && echo "yes"
[root@ shanan test]]# [ 1 -eq 1 ] && [ 2 -eq 2 ] && echo "yes"
yes
[root@ shanan test]# [ 1 -eq 1 -a 2 -eq 2 ] && echo "yes"		'-a和-o也可使用在[]中,更加方便'
yes

1.3.3:一元运算符,二元运算符和三元运算符
一元运算符

带一元运算符的表达式遵循从右到左的结合性,常见的一元表达式:++一元表达式,–一元表达式

前缀自增运算符与前缀自减运算符

在一元表达式的前面添加运算符++或–后得到的表达式是一个一元表达式。操作数将被加1(++)或减1(–),表达式的值是经过加1、减1 以后的值。操作数必须是一个左值。

i=1;

i++: i=$i+1

i=i++:先赋值在运算

i=++i:先自加在赋值

i=–i:先自减在赋值

[root@ shanan test]# i=1
[root@ shanan test]# 
[root@ shanan test]# echo $i
1
[root@ shanan test]# let i=++i
[root@ shanan test]# echo $i
2
[root@ shanan test]# let i+=2
[root@ shanan test]# echo $i
4

二元运算符

a + b = c

三元运算符

条件&&结果1 || 结果2

二:if语句

2.1:if单分支语句

单分支结构(基本格式)
if 条件测试操作
then 命令序列
fi

单分支结构(举例)
if 磁盘已用空间>80%
then 报警
fi

在这里插入图片描述
exit 1 异常退出

exit 0 正常退出

实操演示

#!/bin/bash
#read -p "请输入目录:" dir
dir=/test/one
if [ ! -d $dir ]
 then
        mkdir -p $dir
        echo "$dir创建成功"
fi
[root@ shanan test]# sh eee.sh 
/test/one创建成功

2.2:if双分支语句

双分支结构(基本格式)
if 条件测试操作
then 命令序列1
else 命令序列2
fi

双分支结构(举例)
if 80端口是否在监听
then 网站服务已在运行
else 启动httpd服务
fi

在这里插入图片描述

举例1:

[root@ shanan test]# vim eee.sh

#!/bin/bash
#read -p "请输入目录:" dir
dir=/test/one
if [ ! -d $dir ]
 then
        mkdir -p $dir
        echo "$dir创建成功"
 else
        echo "$dir已存在"

fi
~     
[root@ shanan test]# sh eee.sh 
/test/one已存在

举例2:查看目标主机是否存活,显示检测结果

[root@ shanan ~]# vim ping3.sh
#!/bin/bash

read -p "请输入IP地址:" addr
ping -c 3 -i 0.2 -W 3 $addr &> /dev/null
if [ $? -eq 0 ]
        then
                echo "$addr is up"
        else
                echo "$addr is down"
fi

[root@ shanan ~]# sh ping3.sh 
请输入IP地址:192.168.100.1
192.168.100.1 is up
[root@ shanan ~]# vim ping3.sh
[root@ shanan ~]# sh ping3.sh 
请输入IP地址:192.168.100.9
192.168.100.9 is down

其中:
-c:发送三个包
-i: 发包间隔0.2秒
-W:等待时间3秒

2.3:if多分支语句

多分支结构(基本格式)
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
elif 条件测试操作3

// elif可无限累加子条件
else
命令序列3
在这里插入图片描述

多分支结构(举例)
if 分数为85~100之间
then 判为优秀
elif 分数为70~84之间
then 判为合格
else
判为不合格
fi

举例:判断分数范围,分数优秀,合格,不合格三挡

[root@ shanan ~]# vim kaoshi.sh
#!/bin/bash

read -p "请输入成绩:" score
if [ $score -lt 0 ] || [ $score -gt 100 ]
  then
        echo "输入有误"
        exit 1;
elif [ $score -ge 85 ] && [ $score -le 100 ]
  then
        echo "成绩优秀"
elif [ $score -ge 70 ] && [ $score -le 84 ]
  then
        echo "成绩合格"
else
        echo "成绩不合格"
fi
[root@ shanan ~]# sh kaoshi.sh 
请输入成绩:90
成绩优秀
[root@ shanan ~]# sh kaoshi.sh 
请输入成绩:70
成绩合格
[root@ shanan ~]# sh kaoshi.sh 
请输入成绩:40
成绩不合格
[root@ shanan ~]# sh kaoshi.sh 
请输入成绩:-50
输入有误

– 插入 –

三 . case语句

在这里插入图片描述

3.1 语句结构

case变量值in
模式1)
命令序列1
;;
模式2)
命令序列2
;;

*)
默认命令序列
esac

3.2 小实验-石头剪刀布

#!/bin/bash
computer=$[$RANDOM%3+1]    //定义变量电脑, 后者为随机数生成,范围1-3
read -p " 请问你出什么 石头1 剪刀2 布3 : " player       //定义玩家
case "$computer$player" in                        //定义条件模板

[1][2])                                             //匹配模板
echo "你输了,电脑出的石头,你的剪刀"
;;
[1][3])
echo "你赢了,电脑出的石头,你出的布"
;;
[1][1])
echo "平局,你们都出的石头"
;;
[2][2])
echo "平局,你们都出的剪刀"
;;
[2][1])
echo "你赢了,电脑出的剪刀,你出的石头"
;;
[2][3])
echo "你输了,电脑出的剪刀,你出的布"
;;
[3][3])
echo "平局,你们都出的布"
;;
[3][1])
echo "你输了,电脑出的布,你出的石头"
;;
[3][2]) "你赢了,电脑出的布,你出的剪刀"
;;
*?)                                    //上面没匹配到的,默认匹配它
echo "回家多学会,再来玩"
esac

运行结果
[root@ shanan ~]# sh test4.sh
 请问你出什么 石头1 剪刀231
你输了,电脑出的布,你出的石头
[root@ shanan ~]# sh test4.sh
 请问你出什么 石头1 剪刀232
你输了,电脑出的石头,你的剪刀
[root@ shanan ~]# sh test4.sh
 请问你出什么 石头1 剪刀233
你输了,电脑出的剪刀,你出的布
[root@ shanan ~]# sh test4.sh
 请问你出什么 石头1 剪刀234566
回家多学会,再来玩

猜你喜欢

转载自blog.csdn.net/BIGmustang/article/details/107403268