玄子Share-Shell编程之条件语句
条件测试操作
test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
shell">格式1:test 条件表达式
格式2:[ 条件表达式 ]
# 至少应有一个空格
文件测试
shell">[ 操作符 文件或目录 ]
shell">[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
# 逻辑与,“而且”的意思
整数值比较
shell">[ 整数1 操作符 整数2 ]
- -eq:等于(Equal)
- -ne:不等于(Not Equal)
- -gt:大于(Greater Than)
- -lt:小于(Lesser Than)
- -le:小于或等于(Lesser or Equal)
- -ge:大于或等于(Greater or Equal)
shell">[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
字符串比较
shell">[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
- =:字符串内容相同
- !=:字符串内容不同,
- ! 号表示相反的意思
- -z:字符串内容为空
shell">[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
# 测试当前语言环境
shell">[root@localhost ~]# read -p “是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖
# 测试读入的字符串是否为 yes
逻辑测试
shell">格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
- -a或&&:逻辑与,“而且”的意思
- -o或||:逻辑或,“或者”的意思
- !:逻辑否
shell">[root@localhost ~]# [ -d /etc ] && [ -r /etc ] && echo “You can open it“
[root@localhost ~]# [ -d /etc ] || [ -d /home ] && echo “ok“
if 语句的结构
单分支结构
shell">if 条件测试操作then 命令序列
fi
shell">if 已用磁盘空间>80%then 报警
fi
双分支结构
shell">if 条件测试操作then 命令序列1else 命令序列2
fi
shell">if 80端口是否在监听then 网站服务已在运行else 启动httpd服务
fi
多分支结构
shell">if 条件测试操作1then 命令序列1
elif 条件测试操作2 then 命令序列2
else命令序列3
fi
shell">if 分数为85~100之间then 判为优秀
elif 分数为70~84之间then 判为合格
esle判为不合格
fi
if 语句应用示例
- 判断挂载点目录,若不存在则自动创建
shell">[root@localhost ~]# cat chkmountdir.sh
#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ ! -d $MOUNT_DIR ]
thenmkdir -p $MOUNT_DIR
fi
- 判断目标主机是否存活,显示检测结果
shell">[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命令的检测结果,分别给出不同提示
thenecho "Host $1 is up."
elseecho "Host $1 is down."
fi
- 判断分数范围,分出优秀、合格、不合格三档
shell">[root@localhost ~]# cat gradediv.sh
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
# 判断分数所在区间,给出不同的分档结果
thenecho "$GRADE 分,优秀!"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
thenecho "$GRADE 分,合格!"
elseecho "$GRADE 分,不合格!"
fi
case 语句结构
shell">case 变量值 in
模式1)命令序列1;;
模式2)命令序列2;;……
* )默认命令序列
esac
shell">case 分数 in
85~100)判为优秀;;
70~84)判为合格;;......
*)判为不合格
esac
case 语句应用示例
shell">[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