bash之条件测试:

条件测试:

test EXPRESSION

    [ EXPRESSION ]

    ` EXPRESSION `

    COMMAND


测试表达式:

整数测试:A, B

A -gt B: 大于

A -ge B: 大于等于

A -eq B: 等于

A -lt B: 小于

A -le B: 小于等于

A -ne B: 不等于

bash编程之条件测试if/then_if / then当判断与整数相关的条件时 如上图:通过判断用户ID大小,来确定用户是管理员还是普通用户还是系统用户。UID为0时 是root管理员,UID小于500为系统用户,UID大于500的都为普通用户。



字符串测试:A, B

A > B

A < B

A >= B

A <= B

A == B或A = B:等值比较

A != B: 不等于

-z A: 判断A是否为空;空则为真,不空则假;

-n A:判断A是否不空;不空则为值,空则为假;


条件测试语法:if / then

单分支:

if CONDITION-TURE; then

        CMD1

        CMD2

        ...

fi


if可以嵌套:

if CONDITION1; then

    if CONDITION2; then

    CMD

    fi

fi


条件取反:! CONDITION


双分支:

if CONDITION-TRUE; then

    分支1

else

    分支2

fi         

bash编程之条件测试if/then_if / then_02

如果$stat为no 或n时 则显示echo“停止脚本”,否则else执行echo语句。




多分支的if语句:

if CONDITION1-TRUE; then

    分支1

elif CONDITION2-TRUE; then

    分支2

elif CONDITION3-TRUE; then

    分支3

    ...

else

    分支n

fi

bash编程之条件测试if/then_条件测试_03同时判断两个条件时可使用多分支if语句,如上图所示,先判断httpd服务是否开启,elif再判断nginx是否开启。如果开启则用netstat -ntpl命令查看服务所在端口,不存在时则echo显示没有开启服务。




COMMAND用作条件:

(1) 使用命令执行结果;(a) 使用命令引用

     (b) 使用比较操作符


                例如:[ `id -u $username` -lt 500 ]

                        userid=`id -u $username`

                        [ $userid -lt 500 ]


(2) 使用命令的退出状态码:(a) 先运行命令;

(b) 退出状态码


引用方式两种:

(a) if COMMAND; then

注意:COMMAND不能被命令引用;COMMAND的执行结果通常没有意义,所以其结果通常(&>)被定向至/dev/null

(b) 先执行命令,后判断退出状态码是否为0

COMMAND

if [ $? -eq 0 ]

bash编程之条件测试if/then_if / then_04




条件测试:字符串测试:=~

"$A" =~ PATTERN

如果变量A中保存的字符串能被PATTERN所匹配;即为真;否则为假;


文件测试:$file

-e $file: 是否存在;存在则为真;

-a $file: 同上;弃用;

-f $file: 文件是否存在,且为普通文件;

-d $file: 是否存在且为目录;

-h $file: 是否存在且为符号链接文件;

-L $file:是否存在且为符号链接文件;

-b $file: 是否存在且为块设备文件;

-c $file: 是否存在且为字符设备文件;

-S $file: 是否存在且为套接字文件:

-p $file: 是否存在且为管道文件;


-r $file: 当前用户对此文件是否拥有读权限;

-w $file: 当前用户对此文件是否拥有写权限;

-x $file: 当前用户对此文件是否拥有执行权限;


-u $file: 文件是否拥有suid权限;

-g $file:文件是否拥有sgid权限;

-k $file: 文件是否拥有sticky权限;


-O $file: 当前用户是否为文件的属主;

-G $file: 当前用户是否属于文件的属组;


-N $file: 文件自从上一次被读取之后,是否被修改过;


$f1 -nt $f2: 文件f1是否比文件f2新;

$f1 -ot $f2: 文件f1是否比文件f2旧;

$f1 -ef $f2: f1和f2是否为同一个文件的硬链接;


组合测试条件:

给条件添加逻辑操作符;

或, -o: [ -z "$hostname" -o "$hostname" == 'localhost' ]

与, -a: [ $uid -gt 0 -a $uid -lt 500 ]

非:[ ! EXPRESSION ]

bash编程之条件测试if/then_if / then_05

判断字符串是否为yes |no 使用条件测试-o


短路操作符

与:COMMAND1 && COMMAND2

COMMAND1的退出状态如果为假,则COMMAND2不用运行,即可有最终结果;

或:COMMAND1 || COMMAND2

COMMAND1的退出状态如果为真,则COMMAND2不用运行,即可有最终结果;

非:! COMMAND

[ ! -d /tmp/test ] && mkdir /tmp/test

[ -d /tmp/test ] || mkdir /tmp/test