• 玩转Bash脚本:test測试语句


    总第1篇
    test就是測试的意思,经常使用在流程控制语句中作为条件。以下做一下介绍。

    关于真值

    与其它语言不同,Bash(包含其它Shell)中,是用0表示真,非0表示假的。
    之所以用0表示成功,而不是1来表示。我觉得也是有一定道理的,由于成功的情况仅仅有一种,而出错的可能却有很多,所以用正数来表示错误。不同的正数代表着不同的错误,所以普通情况下能够通过正数的值来推断是出了什么错误。

    假设你有过POSIX编程经验(比方Linux下C编程),你会知道一个errno的东西。你也会知道大量的if语句用来測试一个函数的调用结果。每一个函数基本上都是返回0时表示操作成功。而假设返回非0则出错,此时你也要exit(0)。

    以下言归正传

    測试整数

    基本规则

    整数的test就是大小关系的比較。与其它语言不同。Bash中没有使用<,>来做大于等于号。而是使用了减号开头的选项来比較。

    假如有两个整数变量a和b。

    那么比較a是否大于b,就写作test $a -gt $b,符合条件返回真值0。
    实际在终端里測试的时候能够这样写来看test语句的运行结果:

    test $a -gt $b && echo Yes
    

    假设条件成立打印 Yes,不成立不打印。

    所有选项

    选项描写叙述英文全称
    eq等于equal
    gt大于greater than
    lt小于less than
    ne不等于not equal
    ge大于等于greater or equal
    le小于等于less or equal

    注意:

    每一个选项前须要有一个短横线-


    还要注意的是使用以上操作符,那么操作符两边一定要是整数。


    在Bash中,即使给整数加了引號。比方"123",也视作整数。但假设某一位含有整数[0-9]以外的字符比方。12a,"12a",则不行。

    Bash脚本,或者说Shell终端中的各种命令都有非常丰富的选项。所以我建议在记忆的时候要去记忆它的英文全称。理解了它的含义,这样反而会减少记忆的难度。

    測试字符串

    字符串的測试无非就是包含。推断两个字符串是否相等,推断一个字符串是否为空。
    假设str1和str2是持有两个字符串的变量(直接測试两个字符串。而非字符串变量时,则不加$。这非常好理解)。

    详细使用方法为:

    使用方法描写叙述
    test $str1 = $str2測试是否相等,相等返回0
    test $str1 != $str2測试是否不等。不等返回0
    test $str1 < $str2假设str1的字典序在str2之后,则返回0
    test $str1 > $str2假设str1的字典序在str2之前,则返回0
    test $str1总是返回0
    test -n $str1假设不为空返回0
    test -z $str1假设是空串,返回0

    关于字典序的那两个比較,事实上就是大于号>和小于号<。由于bash中这两个符号有重定向的意思。所以这里要使用反斜杠 转义。

    #在bash中一个好的习惯就是在引用变量的时候加上双引號。

    比方以下:

    特别注意
    选项-n是 nonzero 的缩写,理解为长度不为0但须要特别指出的是:-n选项測试时请将引用变量外加上双引號。


    Bash中的引用变量的方法有非常多种,我觉得此处应该是加不加双引號无所谓的。

    囧。。
    经測试,假设我有当前没有定义变量var(或者定义为var=""),那么理论上讲,var就是空串。
    test -n $var应该是返回1(假)的,由于他的长度是0。但事实上此时不管var是否为空串都会返回真值0。
    可是加上双引號(注意不能是单引號),也就是test -n "$var",效果就能如期,即仅仅有在var为空的时候返回真值0。
    而选项-z(是 zero 的缩写,理解为长度为0)引用变量的时候加不加双引號无所谓。

    測试文件

    測试文件须要用到大量的选项。这里我仅仅写一个经常使用的,其它的大家自行man test

    针对单个文件

    选项描写叙述
    d是否为文件夹
    f是否为普通文件
    x是否有运行权限
    r是否有读权限
    w是否写读权限
    e是否存在
    s文件大小是否大于0
    c是否为字符设备文件
    b是否为块设备文件

    以上条件在成立的时候返回真值0。详细使用方法比方:

    test -f hello.c
    test -d /home
    

    针对两个文件

    使用方法描写叙述
    test file1 -nt file2測试file1的改动时间是不是比file2 new(新)
    test file1 -ot file2測试file1的改动时间是不是比file2 old(旧)
    test file1 -ef file2測试两者是相同的设备和具有相同的结点(inode)数

    相同的,若是条件成立则返回真值0,否则返回假值1。注意这里的file1,file2就是文件名称的字符串了。

    #能够直接test a.c -nt b.c
    #或者是
    a=a.c
    b=b.c
    test $a -nt $b

    不再细表。

    逻辑运算

    逻辑运算就是与或非。Bash中相同有&&。||可是并不是是在test内部。而是用来组合多条shell语句,前面我们应该看到过了。仅仅有当&&前面的语句运行成功时,才运行后面的语句。而在test内部:

    运算符描写叙述
    -a逻辑与
    -o逻辑或
    !逻辑非

    使用方法如:

    test $a -lt $b -a $a -gt $c
    test $a -lt $b -o $a -gt $c
    test ! -d sleep.sh && echo Yes #假设sleep.sh不是文件夹,就打印Yes

    事实上完整版是这样:

    test $a -lt $b -a test $a -gt $c
    test $a -lt $b -o test $a -gt $c 
    

    简化版test

    在读完这一部分后,你可能会惊呼。怎么不早点告诉我。

    哈哈。

    事实上以上所有的test命令都能够用方括号替换。

    比方

    test -f hello.c
    

    能够换成

    [ -f hello.c ]
    

    怎么样,非常方便吧。注意的是。方括号和表达式前后各有一个空格间隔哦。不要丢掉。

    实际也就是 [空格-f hello.c空格]

    其它注意的地方是方括号的逻辑表达式。比方

    test $a -lt $b -a $a -gt $c

    能够转化为

    [ $a -lt $b -a $a -lt $c ]
    

    另外有一操作符 [[ ]]支持使用 &&, ||来进行表达式的逻辑运算. [ ] 与 [[ ]]两者详细区别请见:http://www.cnblogs.com/include/archive/2011/12/09/2307905.html

    test是Shell的外部命令,而[ ]是Shell内置的操作符。


    本系列(玩转Bash脚本)很多其它文章,请訪问:http://blog.csdn.net/column/details/wanbash.html
  • 相关阅读:
    焦虑:都说程序员是青春饭,那么程序员老了何去何从呢?
    数据库查询语句优化,mysql优化,join语句优化附带YYC松鼠短视频系统详细demo效果
    IT行业:为什么大部分人都不认可php语言呢?
    拇指赚点赞无加密源码发布分享仅供学习
    区块鼠区块养殖系统源码无加密源码发布分享仅供学习
    3月1日晚突遭大量攻击,网站/APP突然遭遇黑客攻击时该如何应对?
    ThinkPHP内核全行业小程序运营管理系统源码免费分享下载
    2020年不管打工还是创业,居然还有人相信读书无用论?
    在IT界,应聘企业去上班如果老板一点不懂技术那绝对是作茧自缚
    看了这篇文章你还不懂傅里叶变换,那我就真没办法呢!
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5349062.html
Copyright © 2020-2023  润新知