Linux--Shell编程--条件语句


前言

  • 我们前面已经学习了编写比较简单的shell脚本:各语句按照顺序依次来执行,从而实现“批量处理”的自动化过程
  • 然而,这样比较“单一”的顺序结构写多了,你会不会觉得简单了点?这样,脚本过于机械化,像流水线一样,不够“智能”!
  • 那么,怎样才能从容的应对复杂的系统任务呢
  • 我们接下来去学习如何进行条件测试操作,并通过正确使用if语句,从而使shell脚本具备一定的“判断”能力,从而能根据不同的条件来完成不同的管理任务

一、条件测试

1.测试命令-test

  • 要使shell脚本程序具备一定的“智能”,第一步就需要区分开来不同的情况以确定执行何种操作
  • Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,为0时则成功(表示条件成立),否则(非0值)表示失败或异常
基本格式
test 条件表达式
或
[ 条件表达式 ]        ##此法更为常用,记住留有空格

2.文件测试

基本格式:
[ 操作符 文件或目录 ]

echo &?
##0表示条件成立,反之亦然
可以结合&&使用,比if语句执行效率更高
  • 常用的测试操作符(给我背!fde、rwx
常见操作选项 解释
-f 测试是否为文件(File)
-d 测试是否为目录(Directory)
-e 测试目录或文件是否存在(Exist)
-r 测试当前用户是否有权限读取(Read)
-w 测试当前用户是否有权限写入(Write)
-x 测试当前用户是否有权限执行(Excute)
  • 示例如下
    mark
  • 使用“[[]]”也可以进行条件测试,这里使用到了“||”
    mark
[root@localhost ~]# useradd xuer
[root@localhost ~]# echo "123123" | passwd --stdin xuer
更改用户 xuer 的密码 。
passwd:所有的身份验证令牌已经成功更新。
##新建一个用户用以测试用户权限
[root@localhost ~]# cd /
[root@localhost /]# touch xcf1.txt
[root@localhost /]# su - xuer
上一次登录:三 12月 16 14:31:40 CST 2020pts/1 上
[xuer@localhost ~]$ [ -r /xcf1.txt ] && echo "YES"
YES
[xuer@localhost ~]$ [ -w /xcf1.txt ] && echo "YES"

##可以看到这里新用户只具有读取但是没有写入的权限

3.整数值比较

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

##根据给定的两个整数值,判断前后关系,比如大、小,或等于
  • 给我背!
常用操作符 解释
-eq 等于(Equal)
-ne 不等于(Not Equal)
-gt 大于(Greater Than)
-lt 小于(Lesser Than)
-ge 大于或等于(Greater or Equal)
-le 小于或等于(Lesser or Equal)
  • 示例:判断当前可用空闲内存(free)大小,若当前内存小于3333MB,则建议及时清理(我这里给虚拟机配置比较高 = = )
[root@localhost ~]# free -m        
              total        used        free      shared  buff/cache   available
Mem:           3774         278        3140           9         356        3237
Swap:          4093           0        4093

[root@localhost ~]# free -m | grep "Mem:" | awk '{print $4}'        
3140
[root@localhost ~]# abc=$(free -m | grep "Mem:" | awk '{print $4}')
[root@localhost ~]# echo $abc 
3139
[root@localhost ~]# [ $abc -lt 3333 ] && echo "当前内存为${abc}MB,请及时清理!"
当前内存为3139MB,请及时清理!

##查看当前内存大小
free 以kb单位显示  
free -m 显示MB  
free -h 仅centos7可用

4.字符串比较

  • 通常用来检查用户输入、系统环境是否满足条件
基本格式:
格式1
[ 字符串1 = 字符串2 ]
[ 字符串1 !=字符串2 ]
格式2
[ -z 字符串 ]
常用的测试操作符 解释
= 第一个字符串与第二个字符串内容相同
!= 第一个字符串与第二个字符串内容不同,!号表示相反的意思
-z 检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串
[root@localhost ~]# read -p "思聪姓不姓王:(yes/no)" sicong
思聪姓不姓王:(yes/no)yes
[root@localhost ~]# [ $sicong = "yes" ] && echo "王思聪"
王思聪        ##若输出的是yes则输出王思聪,注意“=”两边的空格!
[root@localhost ~]# [ $sicong != "no" ] && echo "王思聪"
王思聪        ##若输入的不是no,则输出王思聪,注意“=”两边的空格!
[root@localhost ~]# [ -z $sicong ] && echo "王思聪"        ##检查是不是输入的是空格
[root@localhost ~]# 

5.逻辑测试

  • 判断两个或多个条件之间的依赖关系
  • 当系统任务取决于多个不同的条件的时候,判断是根据这些条件同时成立还是只要其中一个成立等情况
基本格式:
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
  • 常用测试操作符:
    • -a或&&:逻辑与,“而且”的意思,得前后条件都符合
    • -o或||:逻辑或,“或者” 的意思,二者其中符合一即可
    • !:逻辑否,只有当指定的条件不成立的时候,结果才成立
  • “&&”、“||”操作符能够正常存在于“[[]]”条件判断结构中,但是如果出现在“[]”结构中会报错
[root@localhost ~]# a=5        ##为变量赋值
[root@localhost ~]# [ $a -ne 1 ] && [ $a -lt 8 ]        ##5大于1或5小于8
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ $a -eq 1 ] && [ $a -lt 8 ]        ##5等于8?
[root@localhost ~]# echo $?
1        ##不成功
[root@localhost ~]# [ $a -ne 1 -a $a -lt 8 ]         ## -a的用法
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ $a -ne 1 && $a -lt 8 ]]        ## &&的用法
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ $a -ne 1 && $a -lt 8 ]] && echo abc123        ##不等于1且小于8就会输出abc123
abc123

二、if语句

1.单分支语句

mark

##基本格式
if 条件测试操作
    then  命令序列
fi
  • 举例
[root@localhost ~]# vim aaa.sh

#!/bin/bash

xcf="xcf.txt"        ##这里可以先设变量

if [ ! -e $xcf ]        ##若文件不存在,则执行下述命令
 then
        touch $xcf
        echo "$xcf创建成功"
fi
[root@localhost ~]# chmod +x abc1.sh 
[root@localhost ~]# . aaa.sh 
xcf.txt创建成功

2.双分支语句

mark

##基本格式
if 条件测试操作
	then  命令序列1
	else  命令序列2
fi
  • 若条件成立,则执行then后面的命令,忽略else,直到fi结束(这里照着之前模板继续)
    mark
    mark
  • 若条件不成立,则忽略then,跳至else后面的命令序列执行,直到fi结束
    mark
    mark

2.3 多分支语句

mark

##基本格式
if 条件测试操作1
	then  命令序列1
elif  条件测试操作2
	then  命令序列2
else
	命令序列3
fi
[root@localhost ~]# vim ccc.sh

#!/bin/bash

read -p "请输入你的成绩(0~100):" cj

if [ $cj -ge 80 ] && [ $cj -le 100 ]
        then
                echo "优秀"

elif [ $cj -ge 60 ] && [ $cj -le 80 ]
        then
                echo "良好"

else
                echo "不及格"

fi

mark


三、case分支语句

  • case语句主要用于以下场景:当每个变量存在多种取值时,需要对其中的每一种取值分别执行不同的命令序列
  • if语句是要判断多个不同条件,而case判断一个变量的不同取值

1.结构

mark

##基本格式
case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	....
*)
	默认命令序列
esac
  • case行尾必须为单词 in ,每一行必须以括号“)”结束
  • 双分号“;;”表示命令序列结束
  • 可以用方括号“[]”表示一个连续的范围;还可以用“|”表示,比如“A|B”
  • 最后的“)*”表示默认模式,如果以上取值都不相同,则执行此行

2.应用示例

[root@localhost ~]# vim ddd.sh

#!/bin/bash
#不说了我要去罚抄了

read -p "请输入你的分数: " sub

case $sub in

100)
        echo "恭喜你 逃过一劫"
        ;;

8[0-9]|9[0-9])
        echo "每道错题抄10遍"
        ;;

6[0-9]|7[0-9])
        echo "每道错题抄20遍"
        ;;

*)
        echo "呵呵 全部30遍"

esac

[root@localhost ~]# chmod +x ddd.sh 
[root@localhost ~]# vim ddd.sh
[root@localhost ~]# . ddd.sh 
请输入你的分数: 100
恭喜你 逃过一劫
[root@localhost ~]# . ddd.sh 
请输入你的分数: 98
呵呵 全部30遍
[root@localhost ~]# vim ddd.sh
[root@localhost ~]# . ddd.sh 
请输入你的分数: 99
每道错题抄10遍
[root@localhost ~]# . ddd.sh 
请输入你的分数: 77
每道错题抄20遍
[root@localhost ~]# . ddd.sh 
请输入你的分数: 55
呵呵 全部30遍
[root@localhost ~]# . ddd.sh 
请输入你的分数: 100
恭喜你 逃过一劫

猜你喜欢

转载自blog.csdn.net/weixin_51486343/article/details/111300594