条件测试 | if语句结构 | case语句结构
条件测试
➤test命令
测试表达式是否成立,若不成立返回0,否则返回非0数值
格式1:test 条件表达式
格式2:[ 条件表达式 ]
或者 :
`echo "$(test 11 == 11 )"$?`
echo " `test 14 == 13 `"$?
➤文件测试
[ 操作符 文件或目录 ]
或者
[ -d /opt ] && echo &?
[ -f /opt ] || echo &?
常用的测试操作符
参数 | 说明 |
---|---|
-d | 测试是否为目录(Directory) |
-e | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有权限执行(eXcute) |
➤整数值比较
[ 整数1 操作数 整数2 ]
[ $(ps aux | wc -l) -gt 5 ] && echo "进程数为: $(ps aux | wc -l)"
[ $(who | wc -l) -le 5 ] && echo "用户数为:$(who | wc -l)"
free=`free -m | grep "Mem:" | awk '{print $4}'`
[ $free -lt 1024 ] && echo "剩余内存空间:${free}M"
常用的测试操作符
参数 | 说明 |
---|---|
-eq | 等于(Equal) |
-ne | 不等于(Not Equal) |
-lt | 小于(Leser Than) |
-gt | 大于(Greater Than) |
-le | 小于或等于(Lesser or Equal) |
-ge | 大于或等于(Greater or Equal) |
扩展:传递参数:xargs
find ./ -name “*.txt” | xargs rm -rf
➤字符串比较
格式1 :[ 字符串1 = 字符串2 ]
[ $PWD = $(pwd) ] && echo "当前路径为:`pwd`"
[ 字符串1 != 字符串2 ]
[ $LANG != "en.us" ] && echo "not en.us"
格式2 [ -z 字符串 ]
read -p "是否覆盖文件(y/n):" ACK
[ $ACK = "y" ] && echo "覆盖"
常用的测试操作符
参数 | 说明 |
---|---|
= | 字符串内容相同 |
!= | 字符串内容不同,!号表示相反的意思 |
-z | 字符串内容为空 |
- n | 字符串有内容 |
➤逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2
常用的测试操作符
参数 | 说明 |
---|---|
-a或&& | 逻辑与,而且的意思 |
-o或 | 逻辑或,或者的意思 |
! | 逻辑否 |
a=5
echo "`[ $a -ne 1 ] && [ $a != 2 ]`"$?
echo "`[ $a -eq 1 ] && [ $a != 2 ]`"$?
或者
echo "`[ $a -eq 1 -a $a != 2 ]`"$?
echo "`[ $a -ne 1 -a $a != 2 ]`"$?
或者
echo "`[[ $a -ne 1 && $a != 2 ]]`"$?
echo "`[[ $a -eq 1 && $a != 2 ]]`"$?
注意:&&、||操作符能够正常存在[[ ]]条件判断结构中,但是如果出现在一个[ ]结构中,就会报错
ping -c 3 -i 0.5 -w 2 192.168.1.8 > /dev/null && echo "$1 online" || echo "$1 off"
ping -c 3 -i 0.5 -w 2 192.168.1.100 > /dev/null && echo "$1 online" || echo "$1 off"
-c:发送包的个数
-i:发送包的时间间隔
-w:多少秒停止
[ 2 -ne 3 ] && echo "true" || echo "false"
[ 4 -le 3 ] && echo "true" || echo "false"
注意: “&& ||” 同时存在时,当" &&" 前的命令判断成立时,“||”执行前面的语句,否则,当" &&" 前的命令判断不成立时,“||”执行后面的语句
[ -f /sys ] && [ -x /mnt ] && echo "you can open it"
[ -r /opt ] && [ -x /mnt ] && echo "you can open it"
[ -r /opt ] || [ -x /mnt ] && echo "you can open it"
if语句的结构
➤单分支结构
if 条件测试操作
then 命令序列
fi
例:
if [ 3 -gt 2 ]
then
echo "正确"
fi
也可以写:
if [3 -gt 2 ];tnen echo "right" ; fi
或者
[ 3 -gt 2 ] && echo "right"
例:
#!/bin/bash
MOUNT_DIR="/opt/dd"
if [ ! -d $MOUNT_DIR ]
then
mkdir -p $MOUNT_DIR
fi
➤双分支结构
if 条件测试操作
then
命令序列 1
else
命令序列 2
fi
例:
#!/bin/bash
a= $(netstat -natp | grep ":80")
if [ "$a" = 0 ]
then
echo "httpd服务正在运行中"
else
echo "httpd 服务未运行,请启动服务"
fi
➤多分支结构
if 条件测试操作
then
命令序列1
elif
条件测试操作2
then
命令序列2
else
命令序列3
fi
例:
#!/bin/bash
read -p "请输入你的分数:" score
if [ 80 -lt $score -a $score -le 100 ]
then
echo " 你的分数为:${score},优秀!!!"
elif [ 60 -le $score -a $score -le 80 ]
then
echo " 你的分数为:${score},合格!!!"
elif [ 0 -le $score -a $score -lt 60 ]
then
echo "你的分数为:${score},不合格!!!"
else
echo " 你的分数无效,重新输入!!!"
fi
case语句的结构
➤case多分枝结构
case多分枝结构
case 变量值 in
模式一)
命令序列
;;
模式二)
命令序列
;;
……
*)
默认命令序列
esac
➤case语句注意事项
➤case行首必须以单词“in”,每一模式必须以单个右括号")“结束
➤双分号”;;“表示命令序列的结束
➤模式字符串中,可以用方括号表示一个连续的范围,如”[0-9]";还可以使用竖杠|表示或,比如a|b
➤*)表示默认模式,其中的*相当于通配符
例:
#!/bin/bash
read -p "请输入你的分数:" score
[ 80 -lt $score -a $score -le 100 ] && a="great"
[ 60 -le $score -a $score -le 80 ] && a="good"
[ 0 -le $score -a $score -lt 60 ] && a="false"
case $a in
great)
echo " 你的分数为:${score},优秀!!!"
;;
good)
echo " 你的分数为:${score},合格!!!"
;;
false)
echo "你的分数为:${score},不合格!!!"
;;
*)
echo " 你的分数无效,重新输入!!!"
esac
正则表达式的写法:
#!/bin/bash
read -p "请输入你的分数:" score
case $score in
8[0-9]|9[0-9]|100)
echo " 你的分数为:${score},优秀!!!"
;;
6[0-9]|7[0-9])
echo " 你的分数为:${score},合格!!!"
;;
[0-9]|[1-5][0-9])
echo "你的分数为:${score},不合格!!!"
;;
*)
echo " 你的分数无效,重新输入!!!"
esac
拓展 :如何获取cpu负荷占比值
top -b -n 1 | grep "%Cpu" | awk '{print $8}'