shell if判断语句

发布于:2022-12-29 ⋅ 阅读:(441) ⋅ 点赞:(0)

目录

1. 语法

2. if [ ] 判断

2.1. 数学比较

2.2. 字符串比较

2.3. 判断字符串为空

2.4. 判断指令结果

2.5. 判断文件状态

2.6. 取反

2.7. 逻辑判断 

2.8. 多层嵌套

2.9. 简写模式

3. if [[ ]] 判断

3.1. 数学比较

3.2. 字符串比较

3.3. 逻辑比较

3.4. 简写模式


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"

本文含有隐藏内容,请 开通VIP 后查看