zoukankan      html  css  js  c++  java
  • Shell脚本的条件测试与比较

    Shell脚本的条件测试与比较

    一、shell脚本的条件测试

    通常,在bash的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结构执行不同的操作,有时也会与if等条件语句相结合,来完成测试判断,以减少程序运行的错误。

    执行条件测试表达式后通常会返回"真"或"假",就行执行命令后返回的值为0表示真,非0表示假一样。

    Bash编程中条件测试常用的语法:

    条件测试语法

    说明

    语法一:test<测试表达式>

    这是利用test命令进行测试表达式的方法。test命令和"<测试表达式>"之间至少有一个空格;

    语法二:[<测试表达式>]

    这是通过[](单中括号)进行条件测试表达式的方法,和test命令的用法相同。[]的边界和内容之间至少有一个空格;

    语法三:[[<测试表达式>]]

    这是通过[[]](双中括号)进行条件测试表达式的方法。是比test和[]更新的语法格式。[[]]的边界和内容之间至少有一个空格;

    语法四:((<测试表达式>))

    这是通过(())(双小括号)进行条件测试表达式的方法,一般用于if语句里。(())(双小括号)两端不需要有空格;

    针对上表格有几个注意事项需要说明下:

    语法一中的test命令和语法二中的[]是等价的。语法三种的[[]]为扩展的test命令,语法四中的(())常用语计算,建议使用相对友好的语法二,即中括号[]的语法格式;

    在[[]]中可以使用通配符等进行模式匹配,这是区别于其他几种语法格式的地方;

    &&、||、>、<等操作符可以应用于[[]]中,但不能应用于[]中,在[]中一般用-a、-o、-gt(用于整数)、-lt(用于整数)代替上述操作符;

    对于整数的关系运算,也可以使用shell的算数运算符(());

    示例:

    test -f file && echo true || echo false

    二、文件测试表达式

    常用文件测试操作符

    说明

    -d文件,d的全拼为directory

    文件存在且为目录则为真,即测试表达式成立;

    -f文件,f的全拼为file

    文件存在且为普通文件则为真,即测试表达式成立;

    -e文件,e的全拼为exist

    文件存在则为真,即测试表达式成立。区别于"-f","-e"不能辨别是目录还是文件;

    -r文件,r的全拼为read

    文件存在且可读测试为真,即测试表达式成立;

    -s文件,s的全拼为size

    文件存在且文件大小不为0则为真,即测试表达式成立;

    -w文件,w的全拼为write

    文件存在则可写为真,即测试表达式成立;

    -x文件,x的全拼为executable

    文件存在且可执行为真,即测试表达式成立;

    -L文件,L的全拼为link

    文件存在且链接文件则为真,即测试表达式成立;

    f1 -nt f2,nt的全拼为newer than

    文件f1比文件f2新则为真,即测试表达式成立。根据文件的修改时间来计算;

    f1 -ot f2,nt的全拼为older than

    文件f1比文件f2旧则为真,即测试表达式成立。根据文件的修改时间来计算;

    这些操作符号对于[[]]、[]、test的测试表达式几乎是通用的。

    三、字符测试表达式

    字符串测试操作符的作用包括;比较两个字符串是否相同、测试字符串的长度是否为零,字符串是否为NULL等;

    常用字符串测试操作符

    说明

    -n"字符串"

    若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero;

    -z"字符串"

    若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写;

    "串1"=串2'

    若字符串1等于字符串2,则为真,即测试表达式成立,可以用"=="代替"=";

    "串1"!="串2"

    若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!=="代替"!=";

    以下是针对字符串测试操作符的提示:

    1. 对于字符串的测试,一定要将字符串加双引号之后在进行比较。如[-n $myvar],特别是使用[]的场景;
    2. 比较符号(例如=和!=)的两端一定要有空格;
    3. "!="和"="可用于比较两个字符串是否相同;

    示例:

    [root@shell ~]# [ -n "abc" ] && echo 1 || echo 0     #如果字符串长度不为0,则输出1,否则输出0;   

    #因为字符串为abc,长度不为0,因此为真,输出1;

     四、整数二元比较操作符

    在[]以及test中使用的比较符号

    在(())和[[]]中使用的比较符号

    说明

    -eq

    ==或=

    相等,全拼为equal

    -ne

    !=

    不相等,全拼为not equal

    -gt

    >

    大于,全拼为gerater than

    -ge

    >=

    大于等于,全拼为gerater equal

    -lt

    <

    小于,全拼为less than

    -le

    <=

    小于等于,全拼为less equal

    以下是针对上述符号的特别说明:

    1、"="和"!="也可以在[]中作比较使用,但在[]中使用包含">"和"<"的符号时,需要用反斜线转义,有时不转义虽然语法不会报错,但是结果可能会不对;

    2、也可以在[[]]中使用包含"-gt"和"-lt"的符号,但是不建议这样使用;

    3、比较符号两端也要有空格;

    示例:

    [root@shell ~]# [ 2 = 1 ] && echo 1 || echo 0

    0

    [root@shell ~]# [ 2 < 1 ] && echo 1 || echo 0

    0

     五、逻辑操作符

    在[]和test中使用的操作符

    在[[]]和(())中使用的操作符

    说明

    -a

    &&

    and,与,两端都为真,则结果为真

    -o

    ||

    or,或,两端有一个为真,则结果为真

    !

    !

    Not,非,两端相反,则结果为真

    对于上述操作符,有如下提示:

    1. 逻辑操作符前后的表达式是否成立,一般用真假来表示;
    2. "!"的中文意思是反,即与一个逻辑值相反的逻辑值;
    3. -a的中文意思是"与"(and或&&),前后两个逻辑值都为"真",综合返回值才为"真",反之为"假";
    4. -o的中文意思是"或"(or或||),前后2个逻辑值只要有一个为"真",返回值就为"真";
    5. 连接两含[]、test或[[]]的表达式可用&&或||;

    示例:

    [root@shell ~]# [ -f /etc/hosts -a -f /etc/services ] && echo 1 || echo 0

    1

    [root@shell ~]# [[ -f /etc/hosts && -f /etc/services ]] && echo 1 || echo 0

    1

    说明:-a和&&的运算规则:只有逻辑操作符两端的表达式都成立时才为真;真(true)表示成立,对应的数字为1;假(false)表示不成立,对应的数字为0。

     

    六、测试表达式test、[]、[[]]、(())的区别总结

    测试表达式操作符

    []

    test

    [[]]

    (())

    边界是否需要空格

    需要

    需要

    需要

    不需要

    逻辑操作符

    !、-a、-o

    !、-a、-o

    !、&&、||

    !、&&、||

    整数比较操作符

    -eq、-gt、-lt、-ge、-le

    -eq、-gt、-lt、-ge、-le

    -eq、-gt、-lt、-ge、-le或=、>、<、>=、<=

    =、>、<、>=、<=

    字符串比较操作符

    =、==、!=

    =、==、!=

    =、==、!=

    =、==、!=

    是否支持通配匹配符

    不支持

    不支持

    支持

    不支持

  • 相关阅读:
    拦截器
    git和bootstrap
    java面试题目
    Struts2笔记
    sql语句的面试题
    公司面试总结
    面试题12 包含 min 函数的栈 【栈】
    面试题11 字符串的排列[算法]
    [面试] 进程和线程的区别(面试题)
    [baidu] 面向对象的三个基本要素和五项基本设计原则
  • 原文地址:https://www.cnblogs.com/Mr-Ding/p/9201243.html
Copyright © 2011-2022 走看看