shell条件测试

一:数值比较

[     20 -gt 10     ]  -gt大于
[     1 -lt 10        ]   -lt小于
[     1 -eq 1      ]    -eq等于
[     1 -ne 10      ]   -ne不等于
[     20 -ge 10      ]    -ge大于等于
[     10 -le 10       ]    -le小于等于

变量长度  ${#pass}

测试语法

格式1: test 条件表达式

格式2: [ 条件表达式 ]

格式3: [[ 条件表达式 ]]

二:文件测试  [ 操作符 文件或目录 ]

-f filename : 当filename 存在时返回真
-b filename : 当filename 存在并且是块文件时返回真(返回0)
-d pathname : 当pathname 存在并且是一个目录时返回真
-h filename : 当filename 存在并且是符号链接文件时返回真 (或 -L filename)
-c filename : 当filename 存在并且是字符文件时返回真
-e pathname : 当由pathname 指定的文件或目录存在时返回真

-g pathname : 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
-k pathname : 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真

三:字符串比较 [ "字符串" = "字符串" ]

=,等于

!=,不等于

-z:判断字符长度是为0
-n: 判断字符长度不是为0

四:and 和 or 

&&   逻辑的 AND 的意思, -a ,两个条件同时成立,为真。注意:&&调用正则时,请使用双中括号。

||  逻辑的 OR 的意思, -o ,两个条件一个成立,为真。注意:||调用正则时,请使用双中括号。

流程控制if

if单分支语法:

if      [       判断条件,为真则执行then后面的      ]    ;     then
     符合该条件执行的语句
fi

例如输入用户名,查询用户是否存在

#!/bin/bash
read -p"请输入用户名:" user  #read -p 隐性定义变量
id $user &>/dev/null         #查询输入的用户是否存在
if [ $? -eq 0  ] ; then        #$?查看上一段程序的执行结果,成功返回为零,失败返回为1
        echo "$user 存在"
fi

双分支结构

if 条件测试 ;then 
命令序列
else 
命令序列
fi

举上面那个例子,我现在查到存在的用户就不做什么了,如果不存在,我想让他自动创建这个用户

#!/bin/bash
read -p"请输入用户名:" user
id $user &>/dev/null
if [ $? -eq 0  ] ; then
        echo "$user 存在"
else
        useradd $user
        echo "用户已创建完成"
fi
~

多分支结构

多分支结构
if 条件测试1
then 命令序列

elif 条件测试2
then 命令序列

elif 条件测试3 
then 命令序列...

else 命令序列
fi

例如:在几点的时候判断当前是下午,中午,上午,还是晚上

#!/bin/bash
shijian=`date +%H`  #声明变量,当前时间是几点
if [ $shijian -gt 6 -a $shijian -lt 11  ] ;then #当前时间大于6点小于11点是上午
        echo "$shijian 是上午"
elif [ $shijian -gt 11 -a $shijian  -lt 13  ] ;then
        echo "$shijian 是中午"
elif [ $shijian -gt 13 -a $shijian -lt 19 ] ; then
        echo "$shijian 是下午"
else
        echo "$shijian 是夜晚"
fi

嵌套结构

if 条件测试1    then 命令序列
    if 条件测试1    then 命令序列

    else 命令序列
    fi
    
else 命令序列
fi

模式匹配:case

case 变量 in
    模式1)
    命令序列1
    ;;

    模式2)
    命令序列2
    ;;

    模式3)
    命令序列3
    ;;

    *)
    无匹配后命令序列
    ;;
    esac