理论+实验·Shell编程之条件语句
文章目录
条件测试操作
test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ]
常用的测试操作符
-d:测试是否为目录
-e:测试目录或文件是否存在
-f:测试是否为文件
-r:测试当前用户是否有权限读取
-w:测试当前用户是否有权限写入
-x:测试当前用户是否有权限执行
文件测试
[ 操作符 文件或目录 ]
常用的测试操作符
[root@localhost ~]# [ -d /dev/cdrom ]
[root@localhost ~]# echo $?
0 ===>返回0表示条件成立
[root@localhost ~]# [ -d /dev/cdrom/Server ]
[root@localhost ~]# echo $?
1 ===>返回1表示条件不成立
[root@localhost ~]# [ -d /dev/cdrom ]&&echo "YES" ===>逻辑与,"而且"的意思
YES
整数值比较
[ 整数1 操作符 整数2 ]
常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or equal)
常用的测试操作符
[root@localhost ~]# who | ec -l
6
[root@localhost ~]# [ $(who | wc-l) -gt 5 ]&&echo "Too many." ===>用户数是否>5
Too Many.
[root@localhost ~]# [ $(who | wc-l) -gt 10 ]&&echo ">=10." ===>用户数是否 >=10
常用的测试操作符
[root@localhost ~]# FreeCC=$(free -m | grep "Mem:" | awk '{print $6}')
[root@localhost ~]# [ $FreeCC -lt 1024 ]&& echo ${FreeCC}MB ===>空闲内存是否<1024MB
588MB
字符串比较
格式1 [ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2 [ -z 字符串 ]
常用的测试操作符
=:字符串内容相同
!=:字符串内容不通,!号表示相反的意思
-z:字符串内容为空
常用的测试操作符
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ]&&echo "Not en.US" ===>测试当前语言环境
Not en.US
[root@localhost ~]# read -p "是否覆盖现有文件 (yes/no)?" ACK
是否覆盖现有文件 (yes/no)? yes
[root@localhost ~]# [ $ACK = "yes" ]&&echo "覆盖" ===>测试读入的字符串是否为yes
覆盖
逻辑测试
格式1: [ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2 …
常用的测试操作符
-a或&&:逻辑与,"而且"的意思
-o或||:逻辑或,"或者"的意思
!:逻辑否
[root@localhost ~]# [ -d /etc ] && [ -r /etc ] && echo "You can open it"
[root@localhost ~]# [ -d /etc ] || [ -d /home ]&&echo "ok"
if语句的结构
单分支结构
if 条件测试操作 if 已用磁盘空间>80%
then 命令序列 then 报警
fi fi
双分支结构
if 条件测试操作 if 80端口是否在监听
then 命令序列1 then 网站服务已在运行
else 命令序列2 else 启动htpd服务
fi fi
多分支结构
if 条件测试操作1 if 分数为85~100之间
then 命令序列1 then 判为优秀
elif 条件测试操作2 elif 分数为70~84之间
then 命令序列2 then 判为合格
else else
命令序列3 判为不合格
fi fi
if语句应用示例
单分支if语句
判断挂载点目录,若不存在则自动创建
[root@locahost ~]# cat chkmountdir.sh
#!/bin/bash
MOUNT_DIR="/dev/cdrom"
if[ ! -d $MOUNT_DIR] ===>当目录不存在时执行
then
mkdir -p $MOUNT_DIR
fi
双分支if语句
判断目标主机是否存货,显示检测结果
[root@localhost ~]# cat pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null ===>"-c"三个测试包 "-i"间隔0.2秒 "-W"超时3秒
if [ $? -eq 0 ]
then ===>判断ping命令的检测结果,分别给出不通提示
echo "Host $1 is up."
else
echo "Host $1 is down."
fi
多分支if语句
判断分数范围,分为优秀,合格,不合格三档
[root@localhost ~]# cat gradediv.sh
#!/bin/bash
read -p "请输入你的分数(0-100):" GRADE
if [ $ake -ge 85 ] && [ $ake -le 100 ] ===>判断分数所在区间,给出不同的分档结果
then
echo "$GRADE分,优秀!"
elif [ $ake -ge 70 ] && [ $ake -le 84 ]
then
echo "$GRADE分,合格!"
else
echo "$GRADE分,不合格!"
fi
case语句结构
case多分支结构
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认命令序列
esca
case语句应用实例
case多分支语句
[root@localhost ~]# cat hitkey.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case $KEY in
[a-z]|[A-Z]) ===>匹配任意字母
echo "您输入的时字母."
;;
[0-9]) ===>匹配任意数字
echo "您输入的时数字."
;;
*) ===>匹配任意字符
echo "您输入的是空格、功能键或其他控制字符."
esac
小实验===>仅供参考还有优化的空间
#!/bin/bash
#石头剪刀布小游戏
num=$[$RANDOM%3+1]
#石头=1 剪刀=2 布=3
read -p "请输入您需要出石头,剪刀还是布:" shoushi
echo "你出的是$shoushi"
if [ $shoushi = 石头 ];then
case $num in
1)
echo "电脑出的是石头,平局"
;;
2)
echo "电脑出的是剪刀,你赢了"
;;
3)
echo "电脑出的是布,你输了"
esac
elif [ $shoushi = 剪刀 ];then
case $num in
1)
echo "电脑出的是石头,你输了"
;;
2)
echo "电脑出的是剪刀,平局"
;;
3)
echo "电脑出的是布,你赢了"
esac
elif [ $shoushi = 布 ];then
case $num in
1)
echo "电脑出的是石头,你赢了"
;;
2)
echo "电脑出的是剪刀,你输了"
;;
3)
echo "电脑出的是布,平局"
esac
else echo "输入的信息有误,请输入正确的信息"
fi
#!/bin/bash
#竞速比赛10秒内进入决赛,分为男子组,女子组
read -p "请输入你的百米赛跑成绩:" miao
read -p "请输入你的性别(男or女):" xing
if [ $xing = 男 ]
then
echo "男子组"
if [ $miao -ge 0 ]&&[ $miao -le 10 ]
then
echo "成绩合格"
else
echo "成绩不合格,被淘汰."
fi
elif [ $xing = 女 ]
then
echo "女子组"
if [ $miao -ge 0 ]&&[ $miao -le 10 ]
then
echo "成绩合格"
else
echo "成绩不合格,被淘汰."
fi
else
echo "请输入正确的信息"
fi