目录
1. 语法
if [条件1]; then
echo "条件1为真"
elif [条件2]; then
echo "条件2为真"
else
echo "条件1和条件2都为假"
fi
2. if [ ] 判断
2.1. 数学比较
- 语法:if [ {数值} {比较符} {数值} ]
if [ 1 -eq 1 ];then
echo "输出 1 等于 1"
else
echo "输出 1 不等于 1"
fi
比较符解释:
-gt:大于
-eq:等于
-lt:小于
-ne:不等于
-ge:大于等于
-le:小于等于
2.2. 字符串比较
- 语法:if [ {字符串} == {字符串} ]
if [ "a" == "a" ];then
echo "a等于a"
else
echo "a不等于a"
fi
比较符解释:
==:等于
!=:不等于
2.3. 判断字符串为空
- 语法:if [ {选项} {变量} ]
var=" "
判断字符串为空一:
if [ -z ${var} ];then
echo "字符串为空"
fi
判断字符串为空二:
if [ ! ${var} ];then
echo "字符串为空"
fi
判断字符串不为空 # 必须使用双引号。空格为算字符
if [ -n "${var}" ];then
echo "字符串不为空"
fi
比较符解释:
-z:判断为空
-n:判断不为空
2.4. 判断指令结果
- 语法:if [命令为真]
判断进程是否存在
if ps -ef |grep ftp; then
echo "这个进程存在"
else
echo "这个进程不存在"
fi
判断端口是否占用
if netstat -nap |grep 2230; then
echo "这个端口已被占用"
else
echo "这个端口未使用"
fi
判断CPU占用情况
if [ `top -b -n 1 |awk 'NR==3{print $2}' |awk -F'.' '{print $1}'` -lt 70 ];then
echo "安全: CPU占用率低于70%"
else
echo "危险: CPU占用率高于70%"
fi
判断上一个指令状态 # $?表示上一个指令的状态,0表示正常,非0表示异常
if [ $? -eq 0 ];then
echo "上一个指令正常执行"
else
echo "上一个指令抛出异常"
fi
2.5. 判断文件状态
- 语法:if [ {选项} {文件} ]
if [ -f /tmp/tmp123 ];then
echo "文件 /tmp/tmp123 存在"
else
echo "文件 /tmp/tmp123 不存在"
fi
比较符解释:
-f:判断文件存在
-d:判断目录存在
-e:判断文件或目录存在
-r:判断文件为可读
-w:判断文件为可写
-x:判断文件为可执行
-s:判断文件存在,且不为空
-O:判断文件存在,且被当前用户拥有
-G:判断文件存在,且默认组为当前用户组
file1 -nt file2:判断文件 file1 比 file2 新
file1 -ot file2:判断文件 file1 比 file2 旧
2.6. 取反
- 语法:if ! [选项]
判断进程不存在
if ! ps -ef |grep ftp; then
echo "这个进程不存在"
else
echo "这个进程存在"
fi
判断这个文件不存在
if [ ! -f /tmp/tmp123 ];then
echo "这个文件不存在"
else
echo "这个文件存在"
fi
2.7. 逻辑判断
- 语法一:if [ {条件1} {选项} {条件2} ]
- 语法二:if [ {条件1} {选项} {条件2} {选项} {条件3}... ]
var1=1
var2=2
逻辑判断与(-a)
if [ ${var1} -eq 1 -a ${var2} -eq 2 ];then
echo "var1等于1,var2等于2,必须同时满足两个条件"
fi
逻辑判断或(-o)
if [ ${var1} -eq 1 -o ${var2} -eq 3 ];then
echo "var1等于1,var2等于3,满足其中一个条件即可"
fi
2.8. 多层嵌套
var=1
多层判断 # 不管增加多少层,使用 elif 即可
if [ ${var} -eq 1 ];then
echo "var 等于 1"
elif [ ${var} -eq 2 ];then
echo "var 等于 2"
elif [ ${var} -eq 3 ];then
echo "var 等于 3"
elif [ ${var} -eq 4 ];then
echo "var 等于 4"
else
echo "var 不等于 1、2、3、4"
fi
多层嵌套 # 多层嵌套一定要有缩进,否则难以阅读。一般不超过3层
if [ ${var} -ne 0 ];then
if [ ${var} -lt 10 ];then
echo "var 不等于0,小于10"
else
echo "var 不等于0,大于等于10"
fi
fi
2.9. 简写模式
var=1
[ ${var} -eq 1 ] && echo "var等于1" || echo "var不等于1"
去掉if,直接使用逻辑判断
&& 表示真
|| 表示假
3. if [[ ]] 判断
- [ ] 中的判断大部分在 [[ ]] 中都可以执行
- [ ] 中判断带有换行的字符串需要使用双引号,而 [[ ]] 不需要双引号
以下列举几个与 [ ] 不同的方法
3.1. 数学比较
if [[ 1 > 0 ]];then
echo "1 大于 0"
else
echo "1 不大于 0"
fi
比较符解释:
> :大于
< :小于
= :等于
!=:不等于
>=:大于等于
<=:小于等于
3.2. 字符串比较
if [[ "abcd" =~ "ab" ]];then
echo "abcd 包含 ab"
fi
比较符解释:
=~:包含(前面字符串必须比大于等于后面字符串)
==:等于
!=:不等于
3.3. 逻辑比较
var=2
************ 写法一 ************
逻辑判断与
if [[ ${var} -gt 0 && ${var} -lt 10 ]];then
echo "var 不等于0,且小于10"
fi
逻辑判断或
if [[ ${var} -gt 0 || ${var} -lt 10 ]];then
echo "var 不等于0,或者小于10"
fi
************ 写法二 ************
if [[ 'aa' == 'aa' ]] && [[ 'bb' == 'bb' ]];then
echo "必须满足两个条件"
fi
if [[ 'ab' == 'aa' ]] || [[ 'bb' == 'bb' ]];then
echo "满足一个条件即可"
fi
&&:表示and
||:表示or
注意:在使用数学运算进行逻辑判断时,比较符号需要使用指定参数,而><=这种符号会无法判断
-gt:大于
-eq:等于
-lt:小于
-ne:不等于
-ge:大于等于
-le:小于等于
3.4. 简写模式
var=1
[[ ${var} = 1 ]] && echo "var等于1" || echo "var不等于1"