玄子Share-Shell编程之条件语句
条件测试操作
test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ]
# 至少应有一个空格
文件测试
[ 操作符 文件或目录 ]
[root@localhost ~]# [ -d /media/cdrom ]
[root@localhost ~]# echo $?
0
# 返回0表示条件成立
[root@localhost ~]# [ -d /media/cdrom/Server ]
[root@localhost ~]# echo $?
1
# 返回1表示条件不成立
[root@localhost ~]# [ -d /media/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 | wc -l
7
[root@localhost ~]# [ $(who | wc -l) -gt 5 ] && echo "Too many."
Too many.
# 用户数是否 > 5
[root@localhost ~]# [ $(who | wc -l) -ge 10 ] && echo "> = 10."
# 用户数是否 >= 10
[root@localhost ~]# FreeCC=$(free -m | grep "Mem: " | awk '{print $6}')
[root@localhost ~]# [ $FreeCC -lt 1024 ] && echo ${FreeCC}MB
275MB
# 空闲内存是否 < 1024MB
字符串比较
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串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 条件测试操作
then 命令序列
fi
if 已用磁盘空间>80%
then 报警
fi
双分支结构
if 条件测试操作
then 命令序列1
else 命令序列2
fi
if 80端口是否在监听
then 网站服务已在运行
else 启动httpd服务
fi
多分支结构
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
if 分数为85~100之间
then 判为优秀
elif 分数为70~84之间
then 判为合格
esle
判为不合格
fi
if 语句应用示例
- 判断挂载点目录,若不存在则自动创建
[root@localhost ~]# cat chkmountdir.sh
#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ ! -d $MOUNT_DIR ]
then
mkdir -p $MOUNT_DIR
fi
- 判断目标主机是否存活,显示检测结果
[root@localhost ~]# cat pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
# “-c”“-i”“-W”选项,分别指定只发送三个测试包、间隔0.2秒、超时3秒
if [ $? -eq 0 ]
# 判断ping命令的检测结果,分别给出不同提示
then
echo "Host $1 is up."
else
echo "Host $1 is down."
fi
- 判断分数范围,分出优秀、合格、不合格三档
[root@localhost ~]# cat gradediv.sh
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
# 判断分数所在区间,给出不同的分档结果
then
echo "$GRADE 分,优秀!"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
echo "$GRADE 分,合格!"
else
echo "$GRADE 分,不合格!"
fi
case 语句结构
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
* )
默认命令序列
esac
case 分数 in
85~100)
判为优秀
;;
70~84)
判为合格
;;
......
*)
判为不合格
esac
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
玄子Share-Shell编程之条件语句 2024-04-24