- 条件判断(if语句、case语句)
- 一、条件判断
- 1.文件测试–test
- 二、if语句
- 1、单分支
- 2、双分支语句
- 3、多分支结构
- 4、嵌套if语句
- 三、case
使用专门的测试工具一test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。
语法格式:
格式1: [ 操作符 条件表达式 ] ps:注意中括号和表达式中间需要隔至少一个空格式
格式2: test 操作符 条件表达
格式3: 支持正则表达式
格式4: 边界不需要空格,是效率最高的
语法 ---关于某个⽂件名的『类型』侦测(存在与否),如 test -e filename -e 该『⽂件名』是否存在?(常⽤) -f 该『⽂件名』是否为⽂件(file)?(常⽤) -d 该『⽂件名』是否为⽬录(directory)?(常⽤) -b 该『⽂件名』是否为⼀个 block device 装置? -c 该『⽂件名』是否为⼀个 character device 装置? -S 该『⽂件名』是否为⼀个 Socket ⽂件? -p 该『⽂件名』是否为⼀个 FIFO (pipe) ⽂件? -L 该『⽂件名』是否为⼀个连结档? 2. 关于⽂件的权限侦测,如 test -r filename -r 侦测该⽂件名是否具有『可读』的属性? -w 侦测该⽂件名是否具有『可写』的属性? -x 侦测该⽂件名是否具有『可执⾏』的属性? -u 侦测该⽂件名是否具有『SUID』的属性? -g 侦测该⽂件名是否具有『SGID』的属性? -k 侦测该⽂件名是否具有『Sticky bit』的属性? -s 侦测该⽂件名是否为『⾮空⽩⽂件』? 3. 两个⽂件之间的⽐较,如: test file1 -nt file2 -nt (newer than)判断 file1 是否⽐ file2 新 -ot (older than)判断 file1 是否⽐ file2 旧 -ef 判断 file2 与 file2 是否为同⼀⽂件,可⽤在判断 hard link 的判 定上。 主要意义在判定,两个⽂件是否均指向同⼀个 inode 哩! 4. 关于两个整数之间的判定,例如 test n1 -eq n2 -eq 两数值相等 (equal) -ne 两数值不等 (not equal) -gt n1 ⼤于 n2 (greater than) -lt n1 ⼩于 n2 (less than) -ge n1 ⼤于等于 n2 (greater than or equal) -le n1 ⼩于等于 n2 (less than or equal) 5. 判定字符串的数据 test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true test -n string 判定字符串是否⾮为 0 ?若 string 为空字符串,则为 false。 注: -n 亦可省略 test str1 = str2 判定 str1 是否等于 str2 ,若相等,则回传 true test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false 6. 多重条件判定,例如: test -r filename -a -x filename -a (and)两状况同时成⽴!例如 test -r file -a -x file,则 file 同 时具有 r 与 x 权限时,才回传 true。 -o (or)两状况任何⼀个成⽴!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。 ! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true 7.逻辑测试 && :前者成立并执行后者 || :前者成立后者不执行,前者不成立,后者执行 ! :非二、if语句 1、单分支
if 条件语句 then 命令 fi
案例:比较3个数字的大小
#!/bin/bash #定义交互式shell,连续提示用户输入3个数字,然后,三个数字比大小,最后要求echo从大到小排列(提示:注意1f语句及判断) read -p "请输入一个整数:" numl read -p "请输入一个整数:" num2 read -p "请输入一个整数:" num3 x=0 if [ $numl -gt $num2 ] then x=$numl numl=$num2 num2=$x fi if [ $numl -gt $num3 ] then x=$numl numl=$num3 num3=$x fi if [ $num2 -gt $num3 ] then x=$num2 num2=$num3 num3=$x fi echo "从大到小排序后数据为:$numl,$num2,$num3"2、双分支语句
if 条件语句 then 命令1 else 命令2 fi
案例
例:判断目标主机时否存活,存活就打印 is up,如果不存活就打印 is down
ping的选项: -c:ping的次数 -i:每次多久ping一次,单位是秒 -W:反馈结果的时间,如果不通可加快反馈时间,单位是秒 [root@localhost ~]# vim 1.sh #!/bin/bash ##基本格式 ip=192.168.113.125 ##定义变量 ping -c 2 -i 0.1 -W 3 $ip &> /dev/null ##ping测试,混合注入到黑洞中,不看结果 if [ $? -eq 0 ] ##返回值比较,意思就是 echo $? then echo "$ip is up" ##ping通,成立输出 is up else echo "$ip is down" ##ping不通,不成立输出 is down fi [root@localhost ~]# sh 1.sh ##执行 192.168.113.125 is up ##成立ping的通输出 is up 192.168.113.341 is down ##不成立ping不通输出 is down
例:判断登陆的是否是管理员
[root@c7-1 ~]# vim 1.sh
#!/bin/bash
if [ $UID -eq 0 ];then
echo "当前登陆用户是管理员root"
else
echo "当前登陆用户不是管理员root"
fi
[root@c7-1 ~]# sh 1.sh
当前登陆用户是管理员root
3、多分支结构
if 条件1 then 命令1 elif 条件2 then 命令2 else 命令3 fi
例:根据输入的考试分数不同来区分优秀,合格,不及格三个档次
[root@localhost ~]# vim 2.sh
#!/bin/bash
read -p "请输入您的分数(0-100):" score
if [ $score -ge 85 ] && [ $score -le 100 ];then //判断$score 是否大于等于85,小于等于100
echo "$score 分,优秀" //条件满足则输出,不满足则继续往下进行判断
elif [ $score -ge 70 ] && [ $score -le 84 ];then
echo "$score 分,合格"
elif [ $score -ge 0 ] && [ $score -le 69 ];then
echo "$score 分,不及格"
else //以上条件都不成立
echo "请输入100以内的分数"
fi
[root@localhost ~]# sh 2.sh
请输入您的分数(0-100) 73
73 分,合格
[root@localhost ~]# sh 2.sh
请输入您的分数(0-100) 1001
请输入100以内的分数
4、嵌套if语句
if 条件1 then 命令1 if 命令2 then 命令2 fi fi
例子:判断用户是否有家目录,如没有询问是否删除用户
#!/bin/bash
read -p "请输入用户名:" user //定义交互式变量
if grep $user /etc/passwd &>/dev/dull //条件测试,判断是否有这个用户并输入给黑洞
then //条件成立 则
if [ -d /home/$user ] //判断用户是否有家目录
then //若条件成立
echo "该用户状态正常" //输出状态正常
else //若以上条件都不成立
read -p "该用户没有家目录,是否删除该用户,请输入[yes/no]:" ask //定义交互式变量
if [ $ask == yes ] //判断输入的是不是yes
then //若条件成立
echo "正在删除用户。。。" //输出
userdel $user &>/dev/null;sleep 2 //删除该用户并延迟两秒
echo "该用户已删除" //输出
elif [ $ask == no ] //条件测试2,判断输入的是不是no
then //若条件成立
exit //退出
fi //结束判断
fi //结束判断
else //若以上条件都不成立
echo "该用户不存在" //输出一个该用户不存在
fi
三、case
case语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值
case 变量值 in 模式1) 命令1 ;; 模式2) 命令2 ;; *) ##其他模式 命令3 ;; esac
case语句的执行流程:首先使用"变量值"与模式1进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号";:"后跳转至esqc,表示结束分支:若与模式1不相匹配,则继续与模式2进行比较,若取值相同则执行模式2后的命令序列,直到遇见双分号“;;”后跳转至esac,表示结束分支依此类推,若找不到任何匹配的值,则执行默认模式*)”后的命令序列,直到遇见esqc后结束分支
案例
#!/bin/bash #查看一周中某天的菜单 read -p "查看今天午餐菜单" week case $week in Monady) echo "今天午餐为XX" ;; Tuesday) echo "今天午餐为XX" ;; …… *) echo "输错啦,想屁吃" ;; esca
看你输入的内容属于什么类型
#!/bin/bash read -p "请输入一个字符,按Enter确认: " key case $key in [a-z]|[A-Z]) echo "你输入的是英文字母" ;; [0-9]) echo "你输入的是数字" ;; *) echo "你输入的是其他字符" ;; esac
使用case 定义一个shell
要求:现学校举行运动会,100米5s-6s的为超人,100米 12-15s为优秀,100米 30s以上的为不及格,其他为意外
#!/bin/bash read -p "请输入你的成绩:" s [ $s -ge 5 -a $s -le 6 ] && a="超人" [ $s -ge 12 -a $s -le 15 ] && a="优秀" [ $s -ge 30 ] && a="不及格" case $a in 超人) echo "你的成绩为$s s,超人" ;; 优秀) echo "你的成绩为$s s,优秀" ;; 不及格) echo "你的成绩为$s s,不及格" ;; *) echo "是个意外,啦啦啦" esac ---------or----------- read -p "请输入你的成绩:" s case $s in [5-6]) echo "你的成绩为$s 秒,超人" ;; 1[2-5]) echo "你的成绩为$s 秒,优秀" ;; [3-9][0-9] echo "你的成绩为$s 秒,不及格" ;; *) echo "出现意外啦!" esac
以上一题为基础,学校现发现统一管理并不合理,所以做出了调整
男生 100米 10-15s 为优秀 10s以下为运动员 30s 以上为不及格
女生 100米 11-16s 为优秀 11s以下为运动员 30s 以上为不合格
#!/bin/bash read -p "请输入你的性别(女生输:1,男生输:2 )" gender read -p "请输入你的成绩(单位:s):" result while [ $gender==[1-2] ] do if [ $gender -eq 1 ] then [ $result -ge 11 -a $result -le 16 ] && a="优秀" [ $result -lt 10 ] && a="运动员" [ $result -ge 30 ] && a="不及格" case $a in 优秀) echo "你的成绩为$result s,优秀" break ;; 运动员) echo "你的成绩为$result s,运动员" break ;; 不及格) echo "你的成绩为$result s,不及格" break ;; *) echo "是个意外,啦啦啦" break esac elif [ $gender -eq 2 ] then [ $result -ge 10 -a $result -le 15 ] && a="优秀" [ $result -lt 11 ] && a="运动员" [ $result -ge 30 ] && a="不及格" case $a in 优秀) echo "你的成绩为$result s,优秀" break ;; 运动员) echo "你的成绩为$result s,运动员" break ;; 不及格) echo "你的成绩为$result s,不及格" break ;; *) echo "是个意外,啦啦啦" break esac else read -p "你输入的性别有误,请重新输入性别(女生输入:1,男生输入:2)" choose gender=$choose fi done ~
result -le 15 ] && a=“优秀”
[ $result -lt 11 ] && a=“运动员”
[ $result -ge 30 ] && a=“不及格”
case
a
i
n
优
秀
)
e
c
h
o
"
你
的
成
绩
为
a in 优秀) echo "你的成绩为
ain优秀)echo"你的成绩为result s,优秀"
break
;;
运动员)
echo “你的成绩为
r
e
s
u
l
t
s
,
运
动
员
"
b
r
e
a
k
;
;
不
及
格
)
e
c
h
o
"
你
的
成
绩
为
result s,运动员" break ;; 不及格) echo "你的成绩为
results,运动员"break;;不及格)echo"你的成绩为result s,不及格”
break
;;
*)
echo “是个意外,啦啦啦”
break
esac
else
read -p “你输入的性别有误,请重新输入性别(女生输入:1,男生输入:2)” choose
gender=$choose
fi
done
~



